*** empty log message ***
authorroot <root>
Mon, 13 Dec 2004 07:18:52 +0000 (07:18 +0000)
committerroot <root>
Mon, 13 Dec 2004 07:18:52 +0000 (07:18 +0000)
Changes
src/command.C
src/rxvt.h

diff --git a/Changes b/Changes
index c276756..059ec18 100644 (file)
--- a/Changes
+++ b/Changes
@@ -11,6 +11,9 @@ FEAT: double-click: more intelligent (urls etc.)
 FEAT: OnTheSpot editing.
 FEAT: tabbed windows (hey, just use screen...)
 
+       - try very hard not to exhaust the tty output buffer, even
+          if it slows down large pastes.
+
 4.5  Mon Dec 13 07:47:16 CET 2004
        - fix an extremely nasty bug in utf8-conversion. upgrade is advised.
         - completely re-wrote selection pasting. This should fix garbled
index e79ab86..8fa267d 100644 (file)
@@ -1060,13 +1060,14 @@ rxvt_term::pty_cb (io_watcher &w, short revents)
   SET_R (this);
   SET_LOCALE (locale);
 
-  if (revents & EVENT_WRITE)
-    tt_write (0, 0);
-  else if (revents & EVENT_READ)
+  if (revents & EVENT_READ)
     // loop, but don't allow a single term to monopolize us
     while (pty_fill ())
       if (cmd_parse ())
         break;
+
+  if (revents & EVENT_WRITE)
+    pty_write ();
 }
 
 void
@@ -4284,60 +4285,53 @@ rxvt_term::tt_printf (const char *fmt,...)
 /* Write data to the pty as typed by the user, pasted with the mouse,
  * or generated by us in response to a query ESC sequence.
  */
+const unsigned int MAX_PTY_WRITE = 255; // minimum MAX_INPUT
+
 void
 rxvt_term::tt_write (const unsigned char *data, unsigned int len)
 {
-  const unsigned int MAX_PTY_WRITE = 255; // minimum MAX_INPUT
-
-  if (len)
+  if (v_buflen == 0)
     {
-      if (v_buflen == 0)
-        {
-          ssize_t written = write (pty.pty, data, min (len, MAX_PTY_WRITE));
+      ssize_t written = write (pty.pty, data, min (len, MAX_PTY_WRITE));
 
-          if ((unsigned int)written == len)
-            return;
+      if ((unsigned int)written == len)
+        return;
 
-          data += written;
-          len -= written;
-        }
+      data += written;
+      len  -= written;
+    }
 
+  v_buffer = (unsigned char *)realloc (v_buffer, v_buflen + len);
 
-      v_buffer = (unsigned char *)realloc (v_buffer, v_buflen + len);
+  memcpy (v_buffer + v_buflen, data, len);
+  v_buflen += len;
 
-      memcpy (v_buffer + v_buflen, data, len);
-      v_buflen += len;
-    }
+  pty_ev.set (EVENT_READ | EVENT_WRITE);
+}
 
-  for (;;)
+void rxvt_term::pty_write ()
+{
+  int written = write (pty.pty, v_buffer, min (v_buflen, MAX_PTY_WRITE));
+
+  if (written > 0)
     {
-      int written = write (pty.pty, v_buffer, min (v_buflen, MAX_PTY_WRITE));
+      v_buflen -= written;
 
-      if (written > 0)
+      if (v_buflen == 0)
         {
-          v_buflen -= written;
+          free (v_buffer);
+          v_buffer = 0;
+          v_buflen = 0;
 
-          if (v_buflen == 0)
-            {
-              free (v_buffer);
-              v_buffer = 0;
-              v_buflen = 0;
-
-              pty_ev.set (EVENT_READ);
-              return;
-            }
-
-          memmove (v_buffer, v_buffer + written, v_buflen);
-        }
-      else if (written != -1 || (errno != EAGAIN && errno != EINTR))
-        // original code just ignores this...
-        destroy ();
-      else
-        {
-          pty_ev.set (EVENT_READ | EVENT_WRITE);
+          pty_ev.set (EVENT_READ);
           return;
         }
+
+      memmove (v_buffer, v_buffer + written, v_buflen);
     }
+  else if (written != -1 || (errno != EAGAIN && errno != EINTR))
+    // original code just ignores this...
+    destroy ();
 }
 
 /*----------------------- end-of-file (C source) -----------------------*/
index e2d5595..8d857f9 100644 (file)
@@ -1258,6 +1258,7 @@ struct rxvt_term : zero_initialized, rxvt_vars {
 
   void tt_printf (const char *fmt,...);
   void tt_write (const unsigned char *data, unsigned int len);
+  void pty_write ();
 
   void tt_winch ();