terminal.c 16.5 KB
Newer Older
1
/* Functions related to terminal devices.
Paul Eggert's avatar
Paul Eggert committed
2
   Copyright (C) 2005-2015 Free Software Foundation, Inc.
3 4 5

This file is part of GNU Emacs.

6
GNU Emacs is free software: you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8 9
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
10 11 12 13 14 15 16

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
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
17
along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
18 19

#include <config.h>
Paul Eggert's avatar
Paul Eggert committed
20

21
#include <stdio.h>
22 23 24 25 26 27 28 29 30

#include "lisp.h"
#include "frame.h"
#include "termchar.h"
#include "termhooks.h"
#include "charset.h"
#include "coding.h"
#include "keyboard.h"

31
/* Chain of all terminals currently in use.  */
32
struct terminal *terminal_list;
33

34
/* The first unallocated terminal id.  */
35
static int next_terminal_id;
36

37
/* The initial terminal device, created by initial_term_init.  */
38
struct terminal *initial_terminal;
39

40
static void delete_initial_terminal (struct terminal *);
41

Paul Eggert's avatar
Paul Eggert committed
42
/* This setter is used only in this file, so it can be private.  */
43
static void
Paul Eggert's avatar
Paul Eggert committed
44 45 46 47 48
tset_param_alist (struct terminal *t, Lisp_Object val)
{
  t->param_alist = val;
}

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72


void
ring_bell (struct frame *f)
{
  if (!NILP (Vring_bell_function))
    {
      Lisp_Object function;

      /* Temporarily set the global variable to nil
	 so that if we get an error, it stays nil
	 and we don't call it over and over.

	 We don't specbind it, because that would carefully
	 restore the bad value if there's an error
	 and make the loop of errors happen anyway.  */

      function = Vring_bell_function;
      Vring_bell_function = Qnil;

      call0 (function);

      Vring_bell_function = function;
    }
73 74
  else if (FRAME_TERMINAL (f)->ring_bell_hook)
    (*FRAME_TERMINAL (f)->ring_bell_hook) (f);
75 76 77 78 79
}

void
update_begin (struct frame *f)
{
80 81
  if (FRAME_TERMINAL (f)->update_begin_hook)
    (*FRAME_TERMINAL (f)->update_begin_hook) (f);
82 83 84 85 86
}

void
update_end (struct frame *f)
{
87 88
  if (FRAME_TERMINAL (f)->update_end_hook)
    (*FRAME_TERMINAL (f)->update_end_hook) (f);
89 90 91 92 93 94 95 96 97 98
}

/* Specify how many text lines, from the top of the window,
   should be affected by insert-lines and delete-lines operations.
   This, and those operations, are used only within an update
   that is bounded by calls to update_begin and update_end.  */

void
set_terminal_window (struct frame *f, int size)
{
99 100
  if (FRAME_TERMINAL (f)->set_terminal_window_hook)
    (*FRAME_TERMINAL (f)->set_terminal_window_hook) (f, size);
101 102 103 104 105 106 107 108
}

/* Move cursor to row/column position VPOS/HPOS.  HPOS/VPOS are
   frame-relative coordinates.  */

void
cursor_to (struct frame *f, int vpos, int hpos)
{
109 110
  if (FRAME_TERMINAL (f)->cursor_to_hook)
    (*FRAME_TERMINAL (f)->cursor_to_hook) (f, vpos, hpos);
111 112 113 114 115 116 117
}

/* Similar but don't take any account of the wasted characters.  */

void
raw_cursor_to (struct frame *f, int row, int col)
{
118
  if (FRAME_TERMINAL (f)->raw_cursor_to_hook)
119
    (*FRAME_TERMINAL (f)->raw_cursor_to_hook) (f, row, col);
120 121
}

122
/* Erase operations.  */
123

124
/* Clear from cursor to end of frame.  */
125 126 127
void
clear_to_end (struct frame *f)
{
128 129
  if (FRAME_TERMINAL (f)->clear_to_end_hook)
    (*FRAME_TERMINAL (f)->clear_to_end_hook) (f);
130 131
}

132
/* Clear entire frame.  */
133 134 135 136

void
clear_frame (struct frame *f)
{
137 138
  if (FRAME_TERMINAL (f)->clear_frame_hook)
    (*FRAME_TERMINAL (f)->clear_frame_hook) (f);
139 140 141 142 143 144 145 146 147 148
}

/* Clear from cursor to end of line.
   Assume that the line is already clear starting at column first_unused_hpos.

   Note that the cursor may be moved, on terminals lacking a `ce' string.  */

void
clear_end_of_line (struct frame *f, int first_unused_hpos)
{
149 150
  if (FRAME_TERMINAL (f)->clear_end_of_line_hook)
    (*FRAME_TERMINAL (f)->clear_end_of_line_hook) (f, first_unused_hpos);
151 152 153 154 155 156 157 158
}

/* Output LEN glyphs starting at STRING at the nominal cursor position.
   Advance the nominal cursor over the text.  */

void
write_glyphs (struct frame *f, struct glyph *string, int len)
{
159 160
  if (FRAME_TERMINAL (f)->write_glyphs_hook)
    (*FRAME_TERMINAL (f)->write_glyphs_hook) (f, string, len);
161 162 163 164 165 166 167 168 169 170 171 172
}

/* Insert LEN glyphs from START at the nominal cursor position.

   If start is zero, insert blanks instead of a string at start */

void
insert_glyphs (struct frame *f, struct glyph *start, int len)
{
  if (len <= 0)
    return;

173 174
  if (FRAME_TERMINAL (f)->insert_glyphs_hook)
    (*FRAME_TERMINAL (f)->insert_glyphs_hook) (f, start, len);
175 176 177 178 179 180 181
}

/* Delete N glyphs at the nominal cursor position. */

void
delete_glyphs (struct frame *f, int n)
{
182 183
  if (FRAME_TERMINAL (f)->delete_glyphs_hook)
    (*FRAME_TERMINAL (f)->delete_glyphs_hook) (f, n);
184 185 186 187 188 189 190
}

/* Insert N lines at vpos VPOS.  If N is negative, delete -N lines.  */

void
ins_del_lines (struct frame *f, int vpos, int n)
{
191 192
  if (FRAME_TERMINAL (f)->ins_del_lines_hook)
    (*FRAME_TERMINAL (f)->ins_del_lines_hook) (f, vpos, n);
193 194
}

195 196 197 198
/* 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 TERMINAL is neither from the above or the
   resulting terminal object is deleted, return NULL.  */
199

200 201
static struct terminal *
decode_terminal (Lisp_Object terminal)
202
{
203
  struct terminal *t;
204

205 206
  if (NILP (terminal))
    terminal = selected_frame;
207 208 209 210 211
  t = (TERMINALP (terminal)
       ? XTERMINAL (terminal)
       : FRAMEP (terminal) ? FRAME_TERMINAL (XFRAME (terminal)) : NULL);
  return t && t->name ? t : NULL;
}
212

213
/* Like above, but throw an error if TERMINAL is not valid or deleted.  */
214

215 216 217 218
struct terminal *
decode_live_terminal (Lisp_Object terminal)
{
  struct terminal *t = decode_terminal (terminal);
219

220
  if (!t)
221
    wrong_type_argument (Qterminal_live_p, terminal);
222 223 224 225 226 227 228 229 230 231
  return t;
}

/* Like decode_terminal, but ensure that the resulting terminal object refers
   to a text-based terminal device.  */

struct terminal *
decode_tty_terminal (Lisp_Object terminal)
{
  struct terminal *t = decode_live_terminal (terminal);
232

233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
  return (t->type == output_termcap || t->type == output_msdos_raw) ? t : NULL;
}

/* Return an active (not suspended) text-based terminal device that uses
   the tty device with the given NAME, or NULL if the named terminal device
   is not opened.  */

struct terminal *
get_named_terminal (const char *name)
{
  struct terminal *t;

  eassert (name);

  for (t = terminal_list; t; t = t->next_terminal)
    {
      if ((t->type == output_termcap || t->type == output_msdos_raw)
          && !strcmp (t->display_info.tty->name, name)
          && TERMINAL_ACTIVE_P (t))
        return t;
    }
  return NULL;
255 256
}

257 258 259 260 261 262 263 264 265
/* Allocate basically initialized terminal.  */

static struct terminal *
allocate_terminal (void)
{
  return ALLOCATE_ZEROED_PSEUDOVECTOR
    (struct terminal, next_terminal, PVEC_TERMINAL);
}

266 267
/* Create a new terminal object of TYPE and add it to the terminal list.  RIF
   may be NULL if this terminal type doesn't support window-based redisplay.  */
268

269
struct terminal *
270
create_terminal (enum output_method type, struct redisplay_interface *rif)
271
{
272
  struct terminal *terminal = allocate_terminal ();
273
  Lisp_Object terminal_coding, keyboard_coding;
274

275 276
  terminal->next_terminal = terminal_list;
  terminal_list = terminal;
277 278
  terminal->type = type;
  terminal->rif = rif;
279
  terminal->id = next_terminal_id++;
280

Dmitry Antipov's avatar
Dmitry Antipov committed
281 282
  terminal->keyboard_coding = xmalloc (sizeof (struct coding_system));
  terminal->terminal_coding = xmalloc (sizeof (struct coding_system));
283

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
  /* 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);
302

303
  return terminal;
304 305
}

306 307
/* Low-level function to close all frames on a terminal, remove it
   from the terminal list and free its memory.  */
308 309

void
310
delete_terminal (struct terminal *terminal)
311
{
312
  struct terminal **tp;
313
  Lisp_Object tail, frame;
314

315
  /* Protect against recursive calls.  delete_frame calls the
316
     delete_terminal_hook when we delete our last frame.  */
317
  if (!terminal->name)
318
    return;
319 320
  xfree (terminal->name);
  terminal->name = NULL;
321

322
  /* Check for live frames that are still on this terminal.  */
323 324 325
  FOR_EACH_FRAME (tail, frame)
    {
      struct frame *f = XFRAME (frame);
326
      if (FRAME_LIVE_P (f) && f->terminal == terminal)
327
        {
328 329
	  /* Pass Qnoelisp rather than Qt.  */
          delete_frame (frame, Qnoelisp);
330 331 332
        }
    }

333 334
  for (tp = &terminal_list; *tp != terminal; tp = &(*tp)->next_terminal)
    if (! *tp)
335
      emacs_abort ();
336 337
  *tp = terminal->next_terminal;

338 339 340 341
  xfree (terminal->keyboard_coding);
  terminal->keyboard_coding = NULL;
  xfree (terminal->terminal_coding);
  terminal->terminal_coding = NULL;
342

343
  if (terminal->kboard && --terminal->kboard->reference_count == 0)
344 345 346 347
    {
      delete_kboard (terminal->kboard);
      terminal->kboard = NULL;
    }
348 349
}

Paul Eggert's avatar
Paul Eggert committed
350
DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0,
351
       doc: /* Delete TERMINAL by deleting all frames on it and closing the terminal.
352 353
TERMINAL may be a terminal object, a frame, or nil (meaning the
selected frame's terminal).
354 355 356

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. */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
357
  (Lisp_Object terminal, Lisp_Object force)
358
{
359
  struct terminal *t = decode_terminal (terminal);
360

361
  if (!t)
362 363
    return Qnil;

364 365 366 367 368
  if (NILP (force))
    {
      struct terminal *p = terminal_list;
      while (p && (p == t || !TERMINAL_ACTIVE_P (p)))
	p = p->next_terminal;
369

370 371 372
      if (!p)
	error ("Attempt to delete the sole active display terminal");
    }
373

374 375 376 377 378 379 380 381 382 383
  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);

384 385
  if (t->delete_terminal_hook)
    (*t->delete_terminal_hook) (t);
386
  else
387
    delete_terminal (t);
388 389 390 391

  return Qnil;
}

392

Paul Eggert's avatar
Paul Eggert committed
393
DEFUN ("frame-terminal", Fframe_terminal, Sframe_terminal, 0, 1, 0,
394 395 396 397
       doc: /* Return the terminal that FRAME is displayed on.
If FRAME is nil, the selected frame is used.

The terminal device is represented by its integer identifier.  */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
398
  (Lisp_Object frame)
399
{
400
  struct terminal *t = FRAME_TERMINAL (decode_live_frame (frame));
401 402 403 404

  if (!t)
    return Qnil;
  else
405 406 407 408 409
    {
      Lisp_Object terminal;
      XSETTERMINAL (terminal, t);
      return terminal;
    }
410 411 412 413 414 415 416
}

DEFUN ("terminal-live-p", Fterminal_live_p, Sterminal_live_p, 1, 1, 0,
       doc: /* Return non-nil if OBJECT is a terminal which has not been deleted.
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
417
possible return values.  */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
418
  (Lisp_Object object)
419
{
420
  struct terminal *t = decode_terminal (object);
421

422
  if (!t)
423 424
    return Qnil;

425
  switch (t->type)
426 427 428 429 430 431 432 433 434 435
    {
    case output_initial: /* The initial frame is like a termcap frame. */
    case output_termcap:
      return Qt;
    case output_x_window:
      return Qx;
    case output_w32:
      return Qw32;
    case output_msdos_raw:
      return Qpc;
436 437
    case output_ns:
      return Qns;
438
    default:
439
      emacs_abort ();
440 441 442
    }
}

443
DEFUN ("terminal-list", Fterminal_list, Sterminal_list, 0, 0, 0,
444
       doc: /* Return a list of all terminal devices.  */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
445
  (void)
446
{
447
  Lisp_Object terminal, terminals = Qnil;
448
  struct terminal *t;
449

450
  for (t = terminal_list; t; t = t->next_terminal)
451 452 453 454
    {
      XSETTERMINAL (terminal, t);
      terminals = Fcons (terminal, terminals);
    }
455

456
  return terminals;
457 458
}

459 460
DEFUN ("terminal-name", Fterminal_name, Sterminal_name, 0, 1, 0,
       doc: /* Return the name of the terminal device TERMINAL.
461 462
It is not guaranteed that the returned value is unique among opened devices.

463
TERMINAL may be a terminal object, a frame, or nil (meaning the
464
selected frame's terminal). */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
465
  (Lisp_Object terminal)
466
{
467
  struct terminal *t = decode_live_terminal (terminal);
468

469
  return t->name ? build_string (t->name) : Qnil;
470 471 472 473
}



474
/* Set the value of terminal parameter PARAMETER in terminal D to VALUE.
475 476
   Return the previous value.  */

477
static Lisp_Object
478
store_terminal_param (struct terminal *t, Lisp_Object parameter, Lisp_Object value)
479
{
480
  Lisp_Object old_alist_elt = Fassq (parameter, t->param_alist);
481 482
  if (EQ (old_alist_elt, Qnil))
    {
Paul Eggert's avatar
Paul Eggert committed
483
      tset_param_alist (t, Fcons (Fcons (parameter, value), t->param_alist));
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
      return Qnil;
    }
  else
    {
      Lisp_Object result = Fcdr (old_alist_elt);
      Fsetcdr (old_alist_elt, value);
      return result;
    }
}


DEFUN ("terminal-parameters", Fterminal_parameters, Sterminal_parameters, 0, 1, 0,
       doc: /* Return the parameter-alist of terminal TERMINAL.
The value is a list of elements of the form (PARM . VALUE), where PARM
is a symbol.

500 501
TERMINAL can be a terminal object, a frame, or nil (meaning the
selected frame's terminal).  */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
502
  (Lisp_Object terminal)
503
{
504
  return Fcopy_alist (decode_live_terminal (terminal)->param_alist);
505 506 507 508
}

DEFUN ("terminal-parameter", Fterminal_parameter, Sterminal_parameter, 2, 2, 0,
       doc: /* Return TERMINAL's value for parameter PARAMETER.
509 510
TERMINAL can be a terminal object, a frame, or nil (meaning the
selected frame's terminal).  */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
511
  (Lisp_Object terminal, Lisp_Object parameter)
512 513
{
  CHECK_SYMBOL (parameter);
514
  return Fcdr (Fassq (parameter, decode_live_terminal (terminal)->param_alist));
515 516 517 518 519 520 521
}

DEFUN ("set-terminal-parameter", Fset_terminal_parameter,
       Sset_terminal_parameter, 3, 3, 0,
       doc: /* Set TERMINAL's value for parameter PARAMETER to VALUE.
Return the previous value of PARAMETER.

522 523
TERMINAL can be a terminal object, a frame or nil (meaning the
selected frame's terminal).  */)
Dan Nicolaescu's avatar
Dan Nicolaescu committed
524
  (Lisp_Object terminal, Lisp_Object parameter, Lisp_Object value)
525
{
526
  return store_terminal_param (decode_live_terminal (terminal), parameter, value);
527 528
}

529 530 531 532 533 534 535 536 537
/* Initial frame has no device-dependent output data, but has
   face cache which should be freed when the frame is deleted.  */

static void
initial_free_frame_resources (struct frame *f)
{
  eassert (FRAME_INITIAL_P (f));
  free_frame_faces (f);
}
538

539 540
/* Create the bootstrap display terminal for the initial frame.
   Returns a terminal of type output_initial.  */
541

542 543
struct terminal *
init_initial_terminal (void)
544
{
545
  if (initialized || terminal_list || tty_list)
546
    emacs_abort ();
547

548
  initial_terminal = create_terminal (output_initial, NULL);
549 550 551
  initial_terminal->name = xstrdup ("initial_terminal");
  initial_terminal->kboard = initial_kboard;
  initial_terminal->delete_terminal_hook = &delete_initial_terminal;
552
  initial_terminal->delete_frame_hook = &initial_free_frame_resources;
553
  /* Other hooks are NULL by default.  */
554

555
  return initial_terminal;
556 557
}

558 559
/* Deletes the bootstrap terminal device.
   Called through delete_terminal_hook. */
560

561 562
static void
delete_initial_terminal (struct terminal *terminal)
563
{
564
  if (terminal != initial_terminal)
565
    emacs_abort ();
566

567 568
  delete_terminal (terminal);
  initial_terminal = NULL;
569 570 571
}

void
572
syms_of_terminal (void)
573 574
{

575
  DEFVAR_LISP ("ring-bell-function", Vring_bell_function,
576 577 578 579
    doc: /* Non-nil means call this function to ring the bell.
The function should accept no arguments.  */);
  Vring_bell_function = Qnil;

580
  DEFVAR_LISP ("delete-terminal-functions", Vdelete_terminal_functions,
581 582 583 584 585
    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;
586 587

  DEFSYM (Qterminal_live_p, "terminal-live-p");
588 589
  DEFSYM (Qdelete_terminal_functions, "delete-terminal-functions");
  DEFSYM (Qrun_hook_with_args, "run-hook-with-args");
590

591 592 593 594 595
  defsubr (&Sdelete_terminal);
  defsubr (&Sframe_terminal);
  defsubr (&Sterminal_live_p);
  defsubr (&Sterminal_list);
  defsubr (&Sterminal_name);
596 597 598 599
  defsubr (&Sterminal_parameters);
  defsubr (&Sterminal_parameter);
  defsubr (&Sset_terminal_parameter);

Dan Nicolaescu's avatar
Dan Nicolaescu committed
600
  Fprovide (intern_c_string ("multi-tty"), Qnil);
601
}