Make ascii driver's length and width parameters fit the terminal.
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 27 Oct 2010 11:13:19 +0000 (13:13 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 27 Oct 2010 11:13:19 +0000 (13:13 +0200)
If the driver's output is a tty, then handle SIGWINCH to adjust
the length and width according to the size of the terminal.

src/output/ascii.c

index c9f96b21b58cbd287d2d41152e572ee6a658bd7d..8b48d9bdd508417c169ac209b41ffb9a720e4bb1 100644 (file)
@@ -21,6 +21,8 @@
 #include <limits.h>
 #include <stdint.h>
 #include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
 
 #include "data/file-name.h"
 #include "data/settings.h"
@@ -786,6 +788,14 @@ ascii_layout_cell (struct ascii_driver *a, const struct table_cell *cell,
 \f
 /* ascii_close_page () and support routines. */
 
+static struct ascii_driver *the_driver;
+
+static void
+winch_handler (int signum UNUSED)
+{
+  update_page_size (the_driver, false);
+}
+
 static bool
 ascii_open_page (struct ascii_driver *a)
 {
@@ -799,6 +809,18 @@ ascii_open_page (struct ascii_driver *a)
       a->file = fn_open (a->file_name, a->append ? "a" : "w");
       if (a->file != NULL)
         {
+         if ( isatty (fileno (a->file)))
+           {
+             struct sigaction action;
+             sigemptyset (&action.sa_mask);
+             action.sa_flags = 0;
+             action.sa_handler = winch_handler;
+             the_driver = a;
+             a->auto_width = true;
+             a->auto_length = true;
+             sigaction (SIGWINCH, &action, NULL);
+           }
+
           if (a->init != NULL)
             fputs (a->init, a->file);
         }