]> code.delx.au - gnu-emacs/blobdiff - src/terminal.c
Merge from emacs--rel--22
[gnu-emacs] / src / terminal.c
index f3f0a178c8d54ab05a7f450b0e4af5b225494c76..46ffb3c2dc814bc7fcdf50387ffd8c1b872d0ed6 100644 (file)
@@ -1,11 +1,11 @@
 /* Functions related to terminal devices.
 /* 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
 
 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,
 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 (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));
     }
 
   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);
 
   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 *
 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;
 
   terminal->next_terminal = terminal_list;
   terminal_list = terminal;
 
@@ -256,20 +249,6 @@ create_terminal (void)
   return terminal;
 }
 
   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);
-    }
-}
-
-
 /* Low-level function to close all frames on a terminal, remove it
    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.  */
 
@@ -281,9 +260,10 @@ delete_terminal (struct terminal *terminal)
 
   /* Protect against recursive calls.  Fdelete_frame calls the
      delete_terminal_hook when we delete our last frame.  */
 
   /* Protect against recursive calls.  Fdelete_frame calls the
      delete_terminal_hook when we delete our last frame.  */
-  if (terminal->deleted)
+  if (!terminal->name)
     return;
     return;
-  terminal->deleted = 1;
+  xfree (terminal->name);
+  terminal->name = NULL;
 
   /* Check for live frames that are still on this terminal. */
   FOR_EACH_FRAME (tail, frame)
 
   /* Check for live frames that are still on this terminal. */
   FOR_EACH_FRAME (tail, frame)
@@ -300,20 +280,18 @@ delete_terminal (struct terminal *terminal)
       abort ();
   *tp = terminal->next_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)
   
 #ifdef MULTI_KBOARD
   if (terminal->kboard && --terminal->kboard->reference_count == 0)
-    delete_kboard (terminal->kboard);
+    {
+      delete_kboard (terminal->kboard);
+      terminal->kboard = NULL;
+    }
 #endif
 #endif
-  
-  bzero (terminal, sizeof (struct terminal));
-  xfree (terminal);
 }
 
 DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0,
 }
 
 DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0,
@@ -364,12 +342,16 @@ The terminal device is represented by its integer identifier.  */)
 
   CHECK_LIVE_FRAME (frame);
 
 
   CHECK_LIVE_FRAME (frame);
 
-  t = get_terminal (frame, 0);
+  t = FRAME_TERMINAL (XFRAME (frame));
 
   if (!t)
     return Qnil;
   else
 
   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,
 }
 
 DEFUN ("terminal-live-p", Fterminal_live_p, Sterminal_live_p, 1, 1, 0,
@@ -377,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
 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;
   
      (object)
      Lisp_Object object;
 {
   struct terminal *t;
   
-  if (!INTEGERP (object))
-    return Qnil;
-
   t = get_terminal (object, 0);
 
   if (!t)
   t = get_terminal (object, 0);
 
   if (!t)
@@ -412,15 +389,17 @@ Display terminals are represented by their integer identifiers. */)
 }
 
 DEFUN ("terminal-list", Fterminal_list, Sterminal_list, 0, 0, 0,
 }
 
 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)
   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;
 }
 
   return terminals;
 }
@@ -434,12 +413,10 @@ selected frame's terminal). */)
   (terminal)
      Lisp_Object 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;
 }
 
 
 }
 
 
@@ -490,7 +467,8 @@ frame's terminal).  */)
      (terminal)
      Lisp_Object 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);
 }
 
   return Fcopy_alist (t->param_alist);
 }
 
@@ -503,54 +481,13 @@ frame's terminal).  */)
      Lisp_Object parameter;
 {
   Lisp_Object value;
      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;
 }
 
   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.
 DEFUN ("set-terminal-parameter", Fset_terminal_parameter,
        Sset_terminal_parameter, 3, 3, 0,
        doc: /* Set TERMINAL's value for parameter PARAMETER to VALUE.
@@ -563,7 +500,8 @@ frame's terminal).  */)
      Lisp_Object parameter;
      Lisp_Object value;
 {
      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);
 }
 
   return store_terminal_param (t, parameter, value);
 }
 
@@ -581,8 +519,9 @@ init_initial_terminal (void)
   initial_terminal = create_terminal ();
   initial_terminal->type = output_initial;
   initial_terminal->name = xstrdup ("initial_terminal");
   initial_terminal = create_terminal ();
   initial_terminal->type = output_initial;
   initial_terminal->name = xstrdup ("initial_terminal");
+#ifdef MULTI_KBOARD
   initial_terminal->kboard = initial_kboard;
   initial_terminal->kboard = initial_kboard;
-
+#endif
   initial_terminal->delete_terminal_hook = &delete_initial_terminal;
   /* All other hooks are NULL. */
 
   initial_terminal->delete_terminal_hook = &delete_initial_terminal;
   /* All other hooks are NULL. */
 
@@ -618,7 +557,6 @@ The function should accept no arguments.  */);
   defsubr (&Sterminal_name);
   defsubr (&Sterminal_parameters);
   defsubr (&Sterminal_parameter);
   defsubr (&Sterminal_name);
   defsubr (&Sterminal_parameters);
   defsubr (&Sterminal_parameter);
-  defsubr (&Smodify_terminal_parameters);
   defsubr (&Sset_terminal_parameter);
 
   Fprovide (intern ("multi-tty"), Qnil);
   defsubr (&Sset_terminal_parameter);
 
   Fprovide (intern ("multi-tty"), Qnil);