--- rxvt-unicode/src/command.C 2004/12/11 17:18:29 1.175 +++ rxvt-unicode/src/command.C 2004/12/15 00:53:23 1.178 @@ -1060,13 +1060,14 @@ 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 @@ -1338,7 +1339,7 @@ &data); set_string_property (XA_CUT_BUFFER0, data); XFree (data); - selection_paste (display->root, XA_CUT_BUFFER0, True); + selection_paste (display->root, XA_CUT_BUFFER0, true); XSetInputFocus (display->display, display->root, RevertToNone, CurrentTime); } #endif /* OFFIX_DND */ @@ -1470,8 +1471,7 @@ case SelectionNotify: if (selection_wait == Sel_normal) - selection_paste (ev.xselection.requestor, - ev.xselection.property, True); + selection_paste (ev.xselection.requestor, ev.xselection.property, true); break; case SelectionRequest: @@ -1670,10 +1670,8 @@ * if user used some Esetroot compatible prog to set the root bg, * use the property to determine the pixmap. We use it later on. */ - if (xa[XA_XROOTPMAPID] == 0) - xa[XA_XROOTPMAPID] = XInternAtom (display->display, "_XROOTPMAP_ID", False); - - if (ev.xproperty.atom != xa[XA_XROOTPMAPID]) + if (ev.xproperty.atom == xa[XA_XROOTPMAP_ID] + || ev.xproperty.atom == xa[XA_ESETROOT_PMAP_ID]) return; /* FALLTHROUGH */ @@ -2353,14 +2351,14 @@ * the root background. Some window managers put multiple nested frame * windows for each client, so we have to take care about that. */ - i = (xa[XA_XROOTPMAPID] - && XGetWindowProperty (display->display, display->root, xa[XA_XROOTPMAPID], + i = (xa[XA_XROOTPMAP_ID] + && XGetWindowProperty (display->display, display->root, xa[XA_XROOTPMAP_ID], 0L, 1L, False, XA_PIXMAP, &atype, &aformat, &nitems, &bytes_after, &prop) == Success); if (!i || prop == NULL) - i = (xa[XA_XSETROOTID] - && XGetWindowProperty (display->display, display->root, xa[XA_XSETROOTID], + i = (xa[XA_ESETROOT_PMAP_ID] + && XGetWindowProperty (display->display, display->root, xa[XA_ESETROOT_PMAP_ID], 0L, 1L, False, XA_PIXMAP, &atype, &aformat, &nitems, &bytes_after, &prop) == Success); @@ -4285,60 +4283,53 @@ /* 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; - - if (v_buflen == 0) - { - free (v_buffer); - v_buffer = 0; - 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) -----------------------*/