X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/7ad8fe5e2876518a8f33b80050f98dab4ff78398..7b81e2d023093bf21cf867ec42ffff3ee7114cf5:/src/terminal.c diff --git a/src/terminal.c b/src/terminal.c index 9ec14ca3c1..c5185601fb 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1,5 +1,5 @@ /* Functions related to terminal devices. - Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2005-2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -18,6 +18,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include #include "lisp.h" #include "frame.h" @@ -36,10 +37,7 @@ static int next_terminal_id; /* The initial terminal device, created by initial_term_init. */ struct terminal *initial_terminal; -/* Function to use to ring the bell. */ -Lisp_Object Vring_bell_function; - -static void delete_initial_terminal P_ ((struct terminal *)); +static void delete_initial_terminal (struct terminal *); @@ -111,7 +109,7 @@ void raw_cursor_to (struct frame *f, int row, int col) { if (FRAME_TERMINAL (f)->raw_cursor_to_hook) - (*FRAME_TERMINAL (f)->raw_cursor_to_hook) (f, row, col); + (*FRAME_TERMINAL (f)->raw_cursor_to_hook) (f, row, col); } /* Erase operations */ @@ -190,10 +188,10 @@ ins_del_lines (struct frame *f, int vpos, int n) -/* Return the terminal object specified by TERMINAL. TERMINAL may be a - terminal id, a frame, or nil for the terminal device of the current - frame. If THROW is zero, return NULL for failure, otherwise throw - an error. */ +/* Return the terminal object specified by TERMINAL. TERMINAL may be + a terminal object, a frame, or nil for the terminal device of the + current frame. If THROW is zero, return NULL for failure, + otherwise throw an error. */ struct terminal * get_terminal (Lisp_Object terminal, int throw) @@ -205,11 +203,8 @@ get_terminal (Lisp_Object terminal, int throw) if (TERMINALP (terminal)) result = XTERMINAL (terminal); - else if (FRAMEP (terminal)) - { - result = FRAME_TERMINAL (XFRAME (terminal)); - } + result = FRAME_TERMINAL (XFRAME (terminal)); if (result && !result->name) result = NULL; @@ -228,6 +223,7 @@ struct terminal * create_terminal (void) { struct terminal *terminal = allocate_terminal (); + Lisp_Object terminal_coding, keyboard_coding; terminal->name = NULL; terminal->next_terminal = terminal_list; @@ -240,8 +236,24 @@ create_terminal (void) terminal->terminal_coding = (struct coding_system *) xmalloc (sizeof (struct coding_system)); - setup_coding_system (Qno_conversion, terminal->keyboard_coding); - setup_coding_system (Qundecided, terminal->terminal_coding); + /* If default coding systems for the terminal and the keyboard are + already defined, use them in preference to the defaults. This is + needed when Emacs runs in daemon mode. */ + keyboard_coding = + find_symbol_value (intern ("default-keyboard-coding-system")); + if (NILP (keyboard_coding) + || EQ (keyboard_coding, Qunbound) + || NILP (Fcoding_system_p (keyboard_coding))) + keyboard_coding = Qno_conversion; + terminal_coding = + find_symbol_value (intern ("default-terminal-coding-system")); + if (NILP (terminal_coding) + || EQ (terminal_coding, Qunbound) + || NILP (Fcoding_system_p (terminal_coding))) + terminal_coding = Qundecided; + + setup_coding_system (keyboard_coding, terminal->keyboard_coding); + setup_coding_system (terminal_coding, terminal->terminal_coding); terminal->param_alist = Qnil; return terminal; @@ -256,7 +268,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; @@ -269,8 +281,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); } } @@ -283,29 +295,24 @@ 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 -frame's terminal). +TERMINAL may be a terminal object, a frame, or nil (meaning the +selected frame's terminal). Normally, you may not delete a display if all other displays are suspended, but if the second argument FORCE is non-nil, you may do so. */) - (terminal, force) - Lisp_Object terminal, force; + (Lisp_Object terminal, Lisp_Object force) { struct terminal *t = get_terminal (terminal, 0); @@ -317,7 +324,7 @@ 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"); } @@ -346,8 +353,7 @@ DEFUN ("frame-terminal", Fframe_terminal, Sframe_terminal, 0, 1, 0, If FRAME is nil, the selected frame is used. The terminal device is represented by its integer identifier. */) - (frame) - Lisp_Object frame; + (Lisp_Object frame) { struct terminal *t; @@ -374,11 +380,10 @@ 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. */) - (object) - Lisp_Object object; + (Lisp_Object object) { struct terminal *t; - + t = get_terminal (object, 0); if (!t) @@ -406,7 +411,7 @@ possible return values. */) DEFUN ("terminal-list", Fterminal_list, Sterminal_list, 0, 0, 0, doc: /* Return a list of all terminal devices. */) - () + (void) { Lisp_Object terminal, terminals = Qnil; struct terminal *t; @@ -424,10 +429,9 @@ DEFUN ("terminal-name", Fterminal_name, Sterminal_name, 0, 1, 0, doc: /* Return the name of the terminal device TERMINAL. It is not guaranteed that the returned value is unique among opened devices. -TERMINAL may be a terminal id, a frame, or nil (meaning the +TERMINAL may be a terminal object, a frame, or nil (meaning the selected frame's terminal). */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct terminal *t = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); @@ -437,26 +441,11 @@ selected frame's terminal). */) -/* Return the value of terminal parameter PARAM in terminal T. */ -Lisp_Object -get_terminal_param (t, param) - struct terminal *t; - Lisp_Object param; -{ - Lisp_Object tem = Fassq (param, t->param_alist); - if (EQ (tem, Qnil)) - return tem; - return Fcdr (tem); -} - /* Set the value of terminal parameter PARAMETER in terminal D to VALUE. Return the previous value. */ -Lisp_Object -store_terminal_param (t, parameter, value) - struct terminal *t; - Lisp_Object parameter; - Lisp_Object value; +static Lisp_Object +store_terminal_param (struct terminal *t, Lisp_Object parameter, Lisp_Object value) { Lisp_Object old_alist_elt = Fassq (parameter, t->param_alist); if (EQ (old_alist_elt, Qnil)) @@ -478,10 +467,9 @@ DEFUN ("terminal-parameters", Fterminal_parameters, Sterminal_parameters, 0, 1, The value is a list of elements of 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) - Lisp_Object terminal; +TERMINAL can be a terminal object, a frame, or nil (meaning the +selected frame's terminal). */) + (Lisp_Object terminal) { struct terminal *t = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); @@ -490,11 +478,9 @@ frame's terminal). */) DEFUN ("terminal-parameter", Fterminal_parameter, Sterminal_parameter, 2, 2, 0, doc: /* Return TERMINAL's value for parameter PARAMETER. -TERMINAL can be a terminal id, a frame or nil (meaning the selected -frame's terminal). */) - (terminal, parameter) - Lisp_Object terminal; - Lisp_Object parameter; +TERMINAL can be a terminal object, a frame, or nil (meaning the +selected frame's terminal). */) + (Lisp_Object terminal, Lisp_Object parameter) { Lisp_Object value; struct terminal *t @@ -509,12 +495,9 @@ DEFUN ("set-terminal-parameter", Fset_terminal_parameter, doc: /* Set TERMINAL's value for parameter PARAMETER to VALUE. Return the previous value of PARAMETER. -TERMINAL can be a terminal id, a frame or nil (meaning the selected -frame's terminal). */) - (terminal, parameter, value) - Lisp_Object terminal; - Lisp_Object parameter; - Lisp_Object value; +TERMINAL can be a terminal object, a frame or nil (meaning the +selected frame's terminal). */) + (Lisp_Object terminal, Lisp_Object parameter, Lisp_Object value) { struct terminal *t = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); @@ -535,9 +518,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. */ @@ -558,23 +539,23 @@ delete_initial_terminal (struct terminal *terminal) } void -syms_of_terminal () +syms_of_terminal (void) { - DEFVAR_LISP ("ring-bell-function", &Vring_bell_function, + DEFVAR_LISP ("ring-bell-function", Vring_bell_function, doc: /* Non-nil means call this function to ring the bell. The function should accept no arguments. */); Vring_bell_function = Qnil; - DEFVAR_LISP ("delete-terminal-functions", &Vdelete_terminal_functions, + 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"); + Qdelete_terminal_functions = intern_c_string ("delete-terminal-functions"); staticpro (&Qdelete_terminal_functions); - Qrun_hook_with_args = intern ("run-hook-with-args"); + Qrun_hook_with_args = intern_c_string ("run-hook-with-args"); staticpro (&Qrun_hook_with_args); defsubr (&Sdelete_terminal); @@ -586,8 +567,5 @@ or some time later. */); defsubr (&Sterminal_parameter); defsubr (&Sset_terminal_parameter); - Fprovide (intern ("multi-tty"), Qnil); + Fprovide (intern_c_string ("multi-tty"), Qnil); } - -/* arch-tag: e9af6f27-b483-47dc-bb1a-730c1c5cab03 - (do not change this comment) */