Prefer plain 'static' to 'static inline'.
[bpt/emacs.git] / src / terminal.c
CommitLineData
ed8dad6b 1/* Functions related to terminal devices.
acaf905b 2 Copyright (C) 2005-2012 Free Software Foundation, Inc.
ed8dad6b
KL
3
4This file is part of GNU Emacs.
5
9ec0b715 6GNU Emacs is free software: you can redistribute it and/or modify
ed8dad6b 7it under the terms of the GNU General Public License as published by
9ec0b715
GM
8the Free Software Foundation, either version 3 of the License, or
9(at your option) any later version.
ed8dad6b
KL
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
9ec0b715 17along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
ed8dad6b
KL
18
19#include <config.h>
3f22b86f
PE
20
21#define TERMHOOKS_INLINE EXTERN_INLINE
22
60f5c938 23#include <stdio.h>
ed8dad6b
KL
24
25#include "lisp.h"
26#include "frame.h"
27#include "termchar.h"
28#include "termhooks.h"
29#include "charset.h"
30#include "coding.h"
31#include "keyboard.h"
32
6ed8eeff
KL
33/* Chain of all terminals currently in use. */
34struct terminal *terminal_list;
ed8dad6b 35
6ed8eeff
KL
36/* The first unallocated terminal id. */
37static int next_terminal_id;
ed8dad6b 38
6ed8eeff
KL
39/* The initial terminal device, created by initial_term_init. */
40struct terminal *initial_terminal;
ed8dad6b 41
f57e2426 42static void delete_initial_terminal (struct terminal *);
ed8dad6b 43
3f22b86f 44/* This setter is used only in this file, so it can be private. */
b0ab8123 45static void
3f22b86f
PE
46tset_param_alist (struct terminal *t, Lisp_Object val)
47{
48 t->param_alist = val;
49}
50
ed8dad6b
KL
51\f
52
53void
54ring_bell (struct frame *f)
55{
56 if (!NILP (Vring_bell_function))
57 {
58 Lisp_Object function;
59
60 /* Temporarily set the global variable to nil
61 so that if we get an error, it stays nil
62 and we don't call it over and over.
63
64 We don't specbind it, because that would carefully
65 restore the bad value if there's an error
66 and make the loop of errors happen anyway. */
67
68 function = Vring_bell_function;
69 Vring_bell_function = Qnil;
70
71 call0 (function);
72
73 Vring_bell_function = function;
74 }
6ed8eeff
KL
75 else if (FRAME_TERMINAL (f)->ring_bell_hook)
76 (*FRAME_TERMINAL (f)->ring_bell_hook) (f);
ed8dad6b
KL
77}
78
79void
80update_begin (struct frame *f)
81{
6ed8eeff
KL
82 if (FRAME_TERMINAL (f)->update_begin_hook)
83 (*FRAME_TERMINAL (f)->update_begin_hook) (f);
ed8dad6b
KL
84}
85
86void
87update_end (struct frame *f)
88{
6ed8eeff
KL
89 if (FRAME_TERMINAL (f)->update_end_hook)
90 (*FRAME_TERMINAL (f)->update_end_hook) (f);
ed8dad6b
KL
91}
92
93/* Specify how many text lines, from the top of the window,
94 should be affected by insert-lines and delete-lines operations.
95 This, and those operations, are used only within an update
96 that is bounded by calls to update_begin and update_end. */
97
98void
99set_terminal_window (struct frame *f, int size)
100{
6ed8eeff
KL
101 if (FRAME_TERMINAL (f)->set_terminal_window_hook)
102 (*FRAME_TERMINAL (f)->set_terminal_window_hook) (f, size);
ed8dad6b
KL
103}
104
105/* Move cursor to row/column position VPOS/HPOS. HPOS/VPOS are
106 frame-relative coordinates. */
107
108void
109cursor_to (struct frame *f, int vpos, int hpos)
110{
6ed8eeff
KL
111 if (FRAME_TERMINAL (f)->cursor_to_hook)
112 (*FRAME_TERMINAL (f)->cursor_to_hook) (f, vpos, hpos);
ed8dad6b
KL
113}
114
115/* Similar but don't take any account of the wasted characters. */
116
117void
118raw_cursor_to (struct frame *f, int row, int col)
119{
6ed8eeff 120 if (FRAME_TERMINAL (f)->raw_cursor_to_hook)
426994c3 121 (*FRAME_TERMINAL (f)->raw_cursor_to_hook) (f, row, col);
ed8dad6b
KL
122}
123
124/* Erase operations */
125
126/* Clear from cursor to end of frame. */
127void
128clear_to_end (struct frame *f)
129{
6ed8eeff
KL
130 if (FRAME_TERMINAL (f)->clear_to_end_hook)
131 (*FRAME_TERMINAL (f)->clear_to_end_hook) (f);
ed8dad6b
KL
132}
133
134/* Clear entire frame */
135
136void
137clear_frame (struct frame *f)
138{
6ed8eeff
KL
139 if (FRAME_TERMINAL (f)->clear_frame_hook)
140 (*FRAME_TERMINAL (f)->clear_frame_hook) (f);
ed8dad6b
KL
141}
142
143/* Clear from cursor to end of line.
144 Assume that the line is already clear starting at column first_unused_hpos.
145
146 Note that the cursor may be moved, on terminals lacking a `ce' string. */
147
148void
149clear_end_of_line (struct frame *f, int first_unused_hpos)
150{
6ed8eeff
KL
151 if (FRAME_TERMINAL (f)->clear_end_of_line_hook)
152 (*FRAME_TERMINAL (f)->clear_end_of_line_hook) (f, first_unused_hpos);
ed8dad6b
KL
153}
154
155/* Output LEN glyphs starting at STRING at the nominal cursor position.
156 Advance the nominal cursor over the text. */
157
158void
159write_glyphs (struct frame *f, struct glyph *string, int len)
160{
6ed8eeff
KL
161 if (FRAME_TERMINAL (f)->write_glyphs_hook)
162 (*FRAME_TERMINAL (f)->write_glyphs_hook) (f, string, len);
ed8dad6b
KL
163}
164
165/* Insert LEN glyphs from START at the nominal cursor position.
166
167 If start is zero, insert blanks instead of a string at start */
168
169void
170insert_glyphs (struct frame *f, struct glyph *start, int len)
171{
172 if (len <= 0)
173 return;
174
6ed8eeff
KL
175 if (FRAME_TERMINAL (f)->insert_glyphs_hook)
176 (*FRAME_TERMINAL (f)->insert_glyphs_hook) (f, start, len);
ed8dad6b
KL
177}
178
179/* Delete N glyphs at the nominal cursor position. */
180
181void
182delete_glyphs (struct frame *f, int n)
183{
6ed8eeff
KL
184 if (FRAME_TERMINAL (f)->delete_glyphs_hook)
185 (*FRAME_TERMINAL (f)->delete_glyphs_hook) (f, n);
ed8dad6b
KL
186}
187
188/* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
189
190void
191ins_del_lines (struct frame *f, int vpos, int n)
192{
6ed8eeff
KL
193 if (FRAME_TERMINAL (f)->ins_del_lines_hook)
194 (*FRAME_TERMINAL (f)->ins_del_lines_hook) (f, vpos, n);
ed8dad6b
KL
195}
196
197
198\f
199
e0c3684a
CY
200/* Return the terminal object specified by TERMINAL. TERMINAL may be
201 a terminal object, a frame, or nil for the terminal device of the
202 current frame. If THROW is zero, return NULL for failure,
203 otherwise throw an error. */
ed8dad6b 204
6ed8eeff
KL
205struct terminal *
206get_terminal (Lisp_Object terminal, int throw)
ed8dad6b 207{
6ed8eeff 208 struct terminal *result = NULL;
ed8dad6b 209
6ed8eeff
KL
210 if (NILP (terminal))
211 terminal = selected_frame;
ed8dad6b 212
d30a25b3
SM
213 if (TERMINALP (terminal))
214 result = XTERMINAL (terminal);
6ed8eeff 215 else if (FRAMEP (terminal))
e0c3684a 216 result = FRAME_TERMINAL (XFRAME (terminal));
ed8dad6b 217
d30a25b3
SM
218 if (result && !result->name)
219 result = NULL;
220
ed8dad6b 221 if (result == NULL && throw)
6ed8eeff 222 wrong_type_argument (Qterminal_live_p, terminal);
ed8dad6b
KL
223
224 return result;
225}
226
227\f
228
6ed8eeff 229/* Create a new terminal object and add it to the terminal list. */
ed8dad6b 230
6ed8eeff
KL
231struct terminal *
232create_terminal (void)
ed8dad6b 233{
d30a25b3 234 struct terminal *terminal = allocate_terminal ();
d6de49a1 235 Lisp_Object terminal_coding, keyboard_coding;
d30a25b3 236
6ed8eeff
KL
237 terminal->next_terminal = terminal_list;
238 terminal_list = terminal;
ed8dad6b 239
6ed8eeff 240 terminal->id = next_terminal_id++;
ed8dad6b 241
23f86fce
DA
242 terminal->keyboard_coding = xmalloc (sizeof (struct coding_system));
243 terminal->terminal_coding = xmalloc (sizeof (struct coding_system));
ed8dad6b 244
d6de49a1
EZ
245 /* If default coding systems for the terminal and the keyboard are
246 already defined, use them in preference to the defaults. This is
247 needed when Emacs runs in daemon mode. */
248 keyboard_coding =
249 find_symbol_value (intern ("default-keyboard-coding-system"));
250 if (NILP (keyboard_coding)
251 || EQ (keyboard_coding, Qunbound)
252 || NILP (Fcoding_system_p (keyboard_coding)))
253 keyboard_coding = Qno_conversion;
254 terminal_coding =
255 find_symbol_value (intern ("default-terminal-coding-system"));
256 if (NILP (terminal_coding)
257 || EQ (terminal_coding, Qunbound)
258 || NILP (Fcoding_system_p (terminal_coding)))
259 terminal_coding = Qundecided;
260
261 setup_coding_system (keyboard_coding, terminal->keyboard_coding);
262 setup_coding_system (terminal_coding, terminal->terminal_coding);
ed8dad6b 263
6ed8eeff 264 return terminal;
ed8dad6b
KL
265}
266
ab797f65
KL
267/* Low-level function to close all frames on a terminal, remove it
268 from the terminal list and free its memory. */
ed8dad6b
KL
269
270void
6ed8eeff 271delete_terminal (struct terminal *terminal)
ed8dad6b 272{
6ed8eeff 273 struct terminal **tp;
ed8dad6b 274 Lisp_Object tail, frame;
a98f1617 275
56f2de10 276 /* Protect against recursive calls. delete_frame calls the
ab797f65 277 delete_terminal_hook when we delete our last frame. */
d30a25b3 278 if (!terminal->name)
a98f1617 279 return;
d30a25b3
SM
280 xfree (terminal->name);
281 terminal->name = NULL;
a98f1617 282
ab797f65 283 /* Check for live frames that are still on this terminal. */
ed8dad6b
KL
284 FOR_EACH_FRAME (tail, frame)
285 {
286 struct frame *f = XFRAME (frame);
6ed8eeff 287 if (FRAME_LIVE_P (f) && f->terminal == terminal)
ed8dad6b 288 {
56f2de10
MR
289 /* Pass Qnoelisp rather than Qt. */
290 delete_frame (frame, Qnoelisp);
ed8dad6b
KL
291 }
292 }
293
6ed8eeff
KL
294 for (tp = &terminal_list; *tp != terminal; tp = &(*tp)->next_terminal)
295 if (! *tp)
1088b922 296 emacs_abort ();
6ed8eeff
KL
297 *tp = terminal->next_terminal;
298
d30a25b3
SM
299 xfree (terminal->keyboard_coding);
300 terminal->keyboard_coding = NULL;
301 xfree (terminal->terminal_coding);
302 terminal->terminal_coding = NULL;
56f2de10 303
6ed8eeff 304 if (terminal->kboard && --terminal->kboard->reference_count == 0)
d30a25b3
SM
305 {
306 delete_kboard (terminal->kboard);
307 terminal->kboard = NULL;
308 }
ed8dad6b
KL
309}
310
58555d81
SM
311Lisp_Object Qrun_hook_with_args;
312static Lisp_Object Qdelete_terminal_functions;
a7ca3326 313DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0,
6ed8eeff 314 doc: /* Delete TERMINAL by deleting all frames on it and closing the terminal.
e173bbce
CY
315TERMINAL may be a terminal object, a frame, or nil (meaning the
316selected frame's terminal).
ed8dad6b
KL
317
318Normally, you may not delete a display if all other displays are suspended,
319but if the second argument FORCE is non-nil, you may do so. */)
5842a27b 320 (Lisp_Object terminal, Lisp_Object force)
ed8dad6b 321{
5b8de9c5 322 struct terminal *t = get_terminal (terminal, 0);
ed8dad6b 323
6ed8eeff 324 if (!t)
ed8dad6b
KL
325 return Qnil;
326
5b8de9c5
SM
327 if (NILP (force))
328 {
329 struct terminal *p = terminal_list;
330 while (p && (p == t || !TERMINAL_ACTIVE_P (p)))
331 p = p->next_terminal;
56f2de10 332
5b8de9c5
SM
333 if (!p)
334 error ("Attempt to delete the sole active display terminal");
335 }
ed8dad6b 336
58555d81
SM
337 if (NILP (Vrun_hooks))
338 ;
339 else if (EQ (force, Qnoelisp))
340 pending_funcalls
341 = Fcons (list3 (Qrun_hook_with_args,
342 Qdelete_terminal_functions, terminal),
343 pending_funcalls);
344 else
345 safe_call2 (Qrun_hook_with_args, Qdelete_terminal_functions, terminal);
346
6ed8eeff
KL
347 if (t->delete_terminal_hook)
348 (*t->delete_terminal_hook) (t);
ed8dad6b 349 else
6ed8eeff 350 delete_terminal (t);
ed8dad6b
KL
351
352 return Qnil;
353}
354
6ed8eeff 355\f
a7ca3326 356DEFUN ("frame-terminal", Fframe_terminal, Sframe_terminal, 0, 1, 0,
6ed8eeff
KL
357 doc: /* Return the terminal that FRAME is displayed on.
358If FRAME is nil, the selected frame is used.
359
360The terminal device is represented by its integer identifier. */)
5842a27b 361 (Lisp_Object frame)
6ed8eeff
KL
362{
363 struct terminal *t;
364
365 if (NILP (frame))
366 frame = selected_frame;
367
368 CHECK_LIVE_FRAME (frame);
369
d30a25b3 370 t = FRAME_TERMINAL (XFRAME (frame));
6ed8eeff
KL
371
372 if (!t)
373 return Qnil;
374 else
d30a25b3
SM
375 {
376 Lisp_Object terminal;
377 XSETTERMINAL (terminal, t);
378 return terminal;
379 }
6ed8eeff
KL
380}
381
382DEFUN ("terminal-live-p", Fterminal_live_p, Sterminal_live_p, 1, 1, 0,
383 doc: /* Return non-nil if OBJECT is a terminal which has not been deleted.
384Value is nil if OBJECT is not a live display terminal.
385If object is a live display terminal, the return value indicates what
386sort of output terminal it uses. See the documentation of `framep' for
d30a25b3 387possible return values. */)
5842a27b 388 (Lisp_Object object)
ed8dad6b 389{
6ed8eeff 390 struct terminal *t;
56f2de10 391
6ed8eeff 392 t = get_terminal (object, 0);
ed8dad6b 393
6ed8eeff 394 if (!t)
ed8dad6b
KL
395 return Qnil;
396
6ed8eeff 397 switch (t->type)
ed8dad6b
KL
398 {
399 case output_initial: /* The initial frame is like a termcap frame. */
400 case output_termcap:
401 return Qt;
402 case output_x_window:
403 return Qx;
404 case output_w32:
405 return Qw32;
406 case output_msdos_raw:
407 return Qpc;
408 case output_mac:
409 return Qmac;
edfda783
AR
410 case output_ns:
411 return Qns;
ed8dad6b 412 default:
1088b922 413 emacs_abort ();
ed8dad6b
KL
414 }
415}
416
6ed8eeff 417DEFUN ("terminal-list", Fterminal_list, Sterminal_list, 0, 0, 0,
d30a25b3 418 doc: /* Return a list of all terminal devices. */)
5842a27b 419 (void)
ed8dad6b 420{
d30a25b3 421 Lisp_Object terminal, terminals = Qnil;
6ed8eeff 422 struct terminal *t;
ed8dad6b 423
6ed8eeff 424 for (t = terminal_list; t; t = t->next_terminal)
d30a25b3
SM
425 {
426 XSETTERMINAL (terminal, t);
427 terminals = Fcons (terminal, terminals);
428 }
ed8dad6b 429
6ed8eeff 430 return terminals;
ed8dad6b
KL
431}
432
6ed8eeff
KL
433DEFUN ("terminal-name", Fterminal_name, Sterminal_name, 0, 1, 0,
434 doc: /* Return the name of the terminal device TERMINAL.
ed8dad6b
KL
435It is not guaranteed that the returned value is unique among opened devices.
436
e173bbce 437TERMINAL may be a terminal object, a frame, or nil (meaning the
6ed8eeff 438selected frame's terminal). */)
5842a27b 439 (Lisp_Object terminal)
ed8dad6b 440{
c5911e55
SM
441 struct terminal *t
442 = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1);
ed8dad6b 443
c5911e55 444 return t->name ? build_string (t->name) : Qnil;
ed8dad6b
KL
445}
446
447
448\f
6ed8eeff 449/* Set the value of terminal parameter PARAMETER in terminal D to VALUE.
ed8dad6b
KL
450 Return the previous value. */
451
426994c3 452static Lisp_Object
971de7fb 453store_terminal_param (struct terminal *t, Lisp_Object parameter, Lisp_Object value)
ed8dad6b 454{
6ed8eeff 455 Lisp_Object old_alist_elt = Fassq (parameter, t->param_alist);
ed8dad6b
KL
456 if (EQ (old_alist_elt, Qnil))
457 {
3f22b86f 458 tset_param_alist (t, Fcons (Fcons (parameter, value), t->param_alist));
ed8dad6b
KL
459 return Qnil;
460 }
461 else
462 {
463 Lisp_Object result = Fcdr (old_alist_elt);
464 Fsetcdr (old_alist_elt, value);
465 return result;
466 }
467}
468
469
470DEFUN ("terminal-parameters", Fterminal_parameters, Sterminal_parameters, 0, 1, 0,
471 doc: /* Return the parameter-alist of terminal TERMINAL.
472The value is a list of elements of the form (PARM . VALUE), where PARM
473is a symbol.
474
e173bbce
CY
475TERMINAL can be a terminal object, a frame, or nil (meaning the
476selected frame's terminal). */)
5842a27b 477 (Lisp_Object terminal)
ed8dad6b 478{
c5911e55
SM
479 struct terminal *t
480 = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1);
6ed8eeff 481 return Fcopy_alist (t->param_alist);
ed8dad6b
KL
482}
483
484DEFUN ("terminal-parameter", Fterminal_parameter, Sterminal_parameter, 2, 2, 0,
485 doc: /* Return TERMINAL's value for parameter PARAMETER.
e173bbce
CY
486TERMINAL can be a terminal object, a frame, or nil (meaning the
487selected frame's terminal). */)
5842a27b 488 (Lisp_Object terminal, Lisp_Object parameter)
ed8dad6b
KL
489{
490 Lisp_Object value;
c5911e55
SM
491 struct terminal *t
492 = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1);
ed8dad6b 493 CHECK_SYMBOL (parameter);
6ed8eeff 494 value = Fcdr (Fassq (parameter, t->param_alist));
ed8dad6b
KL
495 return value;
496}
497
ed8dad6b
KL
498DEFUN ("set-terminal-parameter", Fset_terminal_parameter,
499 Sset_terminal_parameter, 3, 3, 0,
500 doc: /* Set TERMINAL's value for parameter PARAMETER to VALUE.
501Return the previous value of PARAMETER.
502
e173bbce
CY
503TERMINAL can be a terminal object, a frame or nil (meaning the
504selected frame's terminal). */)
5842a27b 505 (Lisp_Object terminal, Lisp_Object parameter, Lisp_Object value)
ed8dad6b 506{
c5911e55
SM
507 struct terminal *t
508 = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1);
6ed8eeff 509 return store_terminal_param (t, parameter, value);
ed8dad6b
KL
510}
511
512\f
513
6ed8eeff
KL
514/* Create the bootstrap display terminal for the initial frame.
515 Returns a terminal of type output_initial. */
ed8dad6b 516
6ed8eeff
KL
517struct terminal *
518init_initial_terminal (void)
ed8dad6b 519{
6ed8eeff 520 if (initialized || terminal_list || tty_list)
1088b922 521 emacs_abort ();
ed8dad6b 522
6ed8eeff
KL
523 initial_terminal = create_terminal ();
524 initial_terminal->type = output_initial;
525 initial_terminal->name = xstrdup ("initial_terminal");
526 initial_terminal->kboard = initial_kboard;
6ed8eeff 527 initial_terminal->delete_terminal_hook = &delete_initial_terminal;
ed8dad6b
KL
528 /* All other hooks are NULL. */
529
6ed8eeff 530 return initial_terminal;
ed8dad6b
KL
531}
532
6ed8eeff
KL
533/* Deletes the bootstrap terminal device.
534 Called through delete_terminal_hook. */
ed8dad6b 535
6ed8eeff
KL
536static void
537delete_initial_terminal (struct terminal *terminal)
ed8dad6b 538{
6ed8eeff 539 if (terminal != initial_terminal)
1088b922 540 emacs_abort ();
ed8dad6b 541
6ed8eeff
KL
542 delete_terminal (terminal);
543 initial_terminal = NULL;
ed8dad6b
KL
544}
545
546void
971de7fb 547syms_of_terminal (void)
ed8dad6b
KL
548{
549
29208e82 550 DEFVAR_LISP ("ring-bell-function", Vring_bell_function,
ed8dad6b
KL
551 doc: /* Non-nil means call this function to ring the bell.
552The function should accept no arguments. */);
553 Vring_bell_function = Qnil;
554
29208e82 555 DEFVAR_LISP ("delete-terminal-functions", Vdelete_terminal_functions,
58555d81
SM
556 doc: /* Special hook run when a terminal is deleted.
557Each function is called with argument, the terminal.
558This may be called just before actually deleting the terminal,
559or some time later. */);
560 Vdelete_terminal_functions = Qnil;
cd3520a4
JB
561 DEFSYM (Qdelete_terminal_functions, "delete-terminal-functions");
562 DEFSYM (Qrun_hook_with_args, "run-hook-with-args");
58555d81 563
6ed8eeff
KL
564 defsubr (&Sdelete_terminal);
565 defsubr (&Sframe_terminal);
566 defsubr (&Sterminal_live_p);
567 defsubr (&Sterminal_list);
568 defsubr (&Sterminal_name);
ed8dad6b
KL
569 defsubr (&Sterminal_parameters);
570 defsubr (&Sterminal_parameter);
ed8dad6b
KL
571 defsubr (&Sset_terminal_parameter);
572
d67b4f80 573 Fprovide (intern_c_string ("multi-tty"), Qnil);
ed8dad6b 574}