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
/* 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) -----------------------*/