--- rxvt-unicode/src/command.C 2004/09/05 09:32:59 1.168 +++ rxvt-unicode/src/command.C 2004/12/15 00:53:23 1.178 @@ -51,6 +51,7 @@ #include "command.h" #include +#include /*----------------------------------------------------------------------*/ @@ -419,7 +420,7 @@ case XK_Insert: /* Shift+Insert = paste mouse selection */ selection_request (ev.time, 0, 0); return; -#if TODO // TODO +#if TODO /* rxvt extras */ case XK_KP_Add: /* Shift+KP_Add = bigger font */ change_font (FONT_UP); @@ -1059,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 @@ -1218,9 +1220,9 @@ } #endif - Window unused_root, unused_child; - int unused_root_x, unused_root_y; - unsigned int unused_mask; + Window unused_root, unused_child; + int unused_root_x, unused_root_y; + unsigned int unused_mask; switch (ev.type) { @@ -1335,12 +1337,9 @@ &ActualType, &ActualFormat, &Size, &RemainingBytes, &data); - XChangeProperty (display->display, display->root, - XA_CUT_BUFFER0, XA_STRING, - 8, PropModeReplace, - data, strlen (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 */ @@ -1454,11 +1453,7 @@ #ifdef TRANSPARENT /* XXX: maybe not needed - leave in for now */ if (options & Opt_transparent) - { - check_our_parents (); - if (am_transparent) - want_refresh = want_full_refresh = 1; - } + check_our_parents (); #endif } break; @@ -1476,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: @@ -1676,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 */ @@ -2359,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); @@ -2417,6 +2409,8 @@ MIN_IT (nw, (unsigned int) (wrootattr.width - sx)); MIN_IT (nh, (unsigned int) (wrootattr.height - sy)); + + XSync (display->display, False); allowedxerror = -1; image = XGetImage (display->display, rootpixmap, sx, sy, nw, nh, AllPlanes, ZPixmap); @@ -2472,7 +2466,9 @@ } } - if (!am_pixmap_trans) + if (am_pixmap_trans) + XSetWindowBackgroundPixmap (display->display, TermWin.vt, ParentRelative); + else { unsigned int n; /* @@ -2547,6 +2543,13 @@ scrollbar_show (0); } + if (am_transparent) + { + want_refresh = want_full_refresh = 1; + if (am_pixmap_trans) + flush (); + } + return pchanged; } #endif @@ -3514,10 +3517,10 @@ unsigned char * rxvt_term::get_to_st (unicode_t &ends_how) { - unicode_t seen_esc = 0, ch; + unicode_t ch; + bool seen_esc = false; unsigned int n = 0; - unsigned char *s; - unsigned char string[STRING_MAX]; + wchar_t string[STRING_MAX]; while ((ch = cmd_getc ()) != NOCHAR) { @@ -3530,7 +3533,7 @@ } else if (ch == C0_ESC) { - seen_esc = 1; + seen_esc = true; continue; } else if (ch == C0_BEL || ch == CHAR_ST) @@ -3538,7 +3541,7 @@ else if (ch < 0x20) return NULL; /* other control character - exit */ - seen_esc = 0; + seen_esc = false; if (n >= sizeof (string) - 1) // stop at some sane length @@ -3552,12 +3555,9 @@ string[n++] = '\0'; - if ((s = (unsigned char *)rxvt_malloc (n)) == NULL) - return NULL; - ends_how = (ch == 0x5c ? C0_ESC : ch); - strncpy (s, string, n); - return s; + + return (unsigned char *)rxvt_wcstombs (string); } /*----------------------------------------------------------------------*/ @@ -3668,7 +3668,7 @@ case XTerm_property: if (str[0] == '?') { - Atom prop = XInternAtom (display->display, str + 1, True); + Atom prop = display->atom (str + 1); Atom actual_type; int actual_format; unsigned long nitems; @@ -3696,10 +3696,7 @@ if (eq) { *eq = 0; - XChangeProperty (display->display, TermWin.parent[0], - display->atom (str), XA_STRING, 8, - PropModeReplace, (unsigned char *)eq + 1, - strlen (eq + 1)); + set_utf8_property (display->atom (str), eq + 1); } else XDeleteProperty (display->display, TermWin.parent[0], @@ -3763,7 +3760,7 @@ process_color_seq (XTerm_Color_RV, Color_RV, str, resp); break; #endif -#if TRANSPARENT || TINTING +#if TRANSPARENT && TINTING case XTerm_Color_tint: process_color_seq (XTerm_Color_tint, Color_tint, str, resp); check_our_parents (); @@ -4286,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; + 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) -----------------------*/