From: root Date: Mon, 13 Dec 2004 07:18:52 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: http://git.openbox.org/?p=dana%2Furxvt.git;a=commitdiff_plain;h=3295c49913ad42f4f5d9b09a73a8c37cc93a5266 *** empty log message *** --- diff --git a/Changes b/Changes index c276756..059ec18 100644 --- 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 diff --git a/src/command.C b/src/command.C index e79ab86..8fa267d 100644 --- a/src/command.C +++ b/src/command.C @@ -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) -----------------------*/ diff --git a/src/rxvt.h b/src/rxvt.h index e2d5595..8d857f9 100644 --- a/src/rxvt.h +++ b/src/rxvt.h @@ -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 ();