Periodically synchronize only the tty's x and y sizes. Initialize
authorTaylor R. Campbell <net/mumble/campbell>
Sat, 21 Mar 2009 08:06:00 +0000 (08:06 +0000)
committerTaylor R. Campbell <net/mumble/campbell>
Sat, 21 Mar 2009 08:06:00 +0000 (08:06 +0000)
the command strings only once; they are unlikely to change, and used
in signal handlers.

v7/src/microcode/uxtty.c

index 875c3eab6e047cf5c3c0c444bdb90e4a709388ee..ed25c86d09c29574d4d079daac4225cdd4bceccd 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Id: uxtty.c,v 1.18 2009/03/21 07:34:36 riastradh Exp $
+$Id: uxtty.c,v 1.19 2009/03/21 08:06:00 riastradh Exp $
 
 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
     1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
@@ -49,8 +49,8 @@ static int tty_y_size;
 static const char * tty_command_beep;
 static const char * tty_command_clear;
 
-static bool tty_synchronized_p;
-static void UX_synchronize_tty (void);
+static bool tty_size_synchronized_p;
+static void UX_synchronize_tty_size (void);
 
 Tchannel
 OS_tty_input_channel (void)
@@ -67,28 +67,26 @@ OS_tty_output_channel (void)
 unsigned int
 OS_tty_x_size (void)
 {
-  UX_synchronize_tty ();
+  UX_synchronize_tty_size ();
   return (tty_x_size);
 }
 
 unsigned int
 OS_tty_y_size (void)
 {
-  UX_synchronize_tty ();
+  UX_synchronize_tty_size ();
   return (tty_y_size);
 }
 
 const char *
 OS_tty_command_beep (void)
 {
-  UX_synchronize_tty ();
   return (tty_command_beep);
 }
 
 const char *
 OS_tty_command_clear (void)
 {
-  UX_synchronize_tty ();
   return (tty_command_clear);
 }
 \f
@@ -125,84 +123,85 @@ tputs_write_char (char c)
 }
 
 static void
-UX_synchronize_tty (void)
+UX_tty_with_termcap (void (*procedure) (void))
 {
-  if (!tty_synchronized_p)
-    {
-      tty_x_size = (-1);
-      tty_y_size = (-1);
-      tty_command_beep = ALERT_STRING;
-      tty_command_clear = 0;
-      /* Figure out the size of the terminal.  First ask the operating
-        system, if it has an appropriate system call.  Then try the
-        environment variables COLUMNS and LINES.  Then try termcap.
-        Finally, use the default.  */
+  tputs_output_scan = tputs_output;
+  {
+    char termcap_buffer [TERMCAP_BUFFER_SIZE];
+    const char *term;
+    if ((isatty (STDOUT_FILENO))
+       && (!option_emacs_subprocess)
+       && ((term = (getenv ("TERM"))) != 0)
+       && ((tgetent (termcap_buffer, term)) > 0))
+      (*procedure) ();
+  }
+}
+\f
+static void
+UX_synchronize_tty_size_with_termcap (void)
+{
+  tty_x_size = (tgetnum ("co"));
+  tty_y_size = (tgetnum ("li"));
+}
+
+static void
+UX_synchronize_tty_size (void)
+{
+  if (tty_size_synchronized_p)
+    return;
+
+  tty_x_size = (-1);
+  tty_y_size = (-1);
+
+  /* Figure out the size of the terminal.  First ask the operating
+     system, if it has an appropriate system call.  Then try the
+     environment variables COLUMNS and LINES.  Then try termcap.
+     Finally, use the default.  */
 #ifdef TIOCGWINSZ
+  {
+    struct winsize size;
+    if ((UX_ioctl (STDOUT_FILENO, TIOCGWINSZ, (&size))) >= 0)
       {
-       struct winsize size;
-       if ((UX_ioctl (STDOUT_FILENO, TIOCGWINSZ, (&size))) >= 0)
-         {
-           tty_x_size = (size . ws_col);
-           tty_y_size = (size . ws_row);
-         }
+       tty_x_size = (size . ws_col);
+       tty_y_size = (size . ws_row);
       }
+  }
 #endif /* TIOCGWINSZ */
-      if ((tty_x_size <= 0) || (tty_y_size <= 0))
+
+  if ((tty_x_size <= 0) || (tty_y_size <= 0))
+    {
+      const char * columns = (UX_getenv ("COLUMNS"));
+      const char * lines = (UX_getenv ("LINES"));
+      if ((columns != 0) && (lines != 0))
        {
-         const char * columns = (UX_getenv ("COLUMNS"));
-         const char * lines = (UX_getenv ("LINES"));
-         if ((columns != 0) && (lines != 0))
+         int x = (atoi (columns));
+         int y = (atoi (lines));
+         if ((x > 0) && (y > 0))
            {
-             int x = (atoi (columns));
-             int y = (atoi (lines));
-             if ((x > 0) && (y > 0))
-               {
-                 tty_x_size = x;
-                 tty_y_size = y;
-               }
+             tty_x_size = x;
+             tty_y_size = y;
            }
        }
-      tputs_output_scan = tputs_output;
-      {
-       static char tgetstr_buffer [TERMCAP_BUFFER_SIZE];
-       char termcap_buffer [TERMCAP_BUFFER_SIZE];
-       char * tbp = tgetstr_buffer;
-       const char * term;
-       if ((isatty (STDOUT_FILENO))
-           && (!option_emacs_subprocess)
-           && ((term = (getenv ("TERM"))) != 0)
-           && ((tgetent (termcap_buffer, term)) > 0))
-         {
-           if ((tty_x_size <= 0) || (tty_y_size <= 0))
-             {
-               tty_x_size = (tgetnum ("co"));
-               tty_y_size = (tgetnum ("li"));
-             }
-           tty_command_clear = (tgetstr ("cl", (&tbp)));
-         }
-      }
-      if ((tty_x_size <= 0) || (tty_y_size <= 0))
-       {
-         tty_x_size = DEFAULT_TTY_X_SIZE;
-         tty_y_size = DEFAULT_TTY_Y_SIZE;
-       }
-      if (tty_command_clear == 0)
-       tty_command_clear = "\f";
-      else
-       {
-         char * command = tputs_output_scan;
-         tputs (tty_command_clear, tty_y_size, tputs_write_char);
-         (*tputs_output_scan++) = '\0';
-         tty_command_clear = command;
-       }
-      tty_synchronized_p = true;
     }
-}
 
-void
-UX_reinitialize_tty (void)
+  if ((tty_x_size <= 0) || (tty_y_size <= 0))
+    UX_tty_with_termcap (&UX_synchronize_tty_size_with_termcap);
+
+  if ((tty_x_size <= 0) || (tty_y_size <= 0))
+    {
+      tty_x_size = DEFAULT_TTY_X_SIZE;
+      tty_y_size = DEFAULT_TTY_Y_SIZE;
+    }
+
+  tty_size_synchronized_p = true;
+}
+\f
+static void
+UX_initialize_tty_with_termcap (void)
 {
-  tty_synchronized_p = false;
+  static char tgetstr_buffer [TERMCAP_BUFFER_SIZE];
+  char *tbp = tgetstr_buffer;
+  tty_command_clear = (tgetstr ("cl", (&tbp)));
 }
 
 void
@@ -212,6 +211,24 @@ UX_initialize_tty (void)
   (CHANNEL_INTERNAL (input_channel)) = 1;
   output_channel = (OS_open_fd (STDOUT_FILENO));
   (CHANNEL_INTERNAL (output_channel)) = 1;
-  tty_synchronized_p = false;
-  UX_synchronize_tty ();
+  tty_size_synchronized_p = false;
+  UX_synchronize_tty_size ();
+  tty_command_beep = ALERT_STRING;
+  tty_command_clear = 0;
+  UX_tty_with_termcap (&UX_initialize_tty_with_termcap);
+  if (tty_command_clear == 0)
+    tty_command_clear = "\f";
+  else
+    {
+      char * command = tputs_output_scan;
+      tputs (tty_command_clear, tty_y_size, tputs_write_char);
+      (*tputs_output_scan++) = '\0';
+      tty_command_clear = command;
+    }
+}
+
+void
+UX_reinitialize_tty (void)
+{
+  tty_size_synchronized_p = false;
 }