--- rxvt-unicode/src/command.C 2004/08/16 12:04:57 1.145 +++ rxvt-unicode/src/command.C 2004/12/13 07:18:52 1.177 @@ -51,6 +51,7 @@ #include "command.h" #include +#include /*----------------------------------------------------------------------*/ @@ -135,7 +136,8 @@ if (t != NOCHAR || !x) { - iso14755_51 (screen.text[y + TermWin.saveLines - TermWin.view_start][x]); + iso14755_51 (screen.text[y + TermWin.saveLines - TermWin.view_start][x], + screen.rend[y + TermWin.saveLines - TermWin.view_start][x]); iso14755buf = ISO_14755_54; break; } @@ -148,9 +150,11 @@ #if ENABLE_OVERLAY void -rxvt_term::iso14755_51 (wchar_t ch) +rxvt_term::iso14755_51 (unicode_t ch, rend_t r) { - wchar_t *chr, *alloc; + rxvt_fontset *fs = FONTSET (r); + rxvt_font *f = (*fs)[fs->find_font (ch)]; + wchar_t *chr, *alloc, ch2; int len; #if ENABLE_COMBINING @@ -163,12 +167,18 @@ else #endif { + ch2 = ch; + alloc = 0; - chr = &ch; + chr = &ch2; len = 1; } - scr_overlay_new (0, -1, 8 + 5, len); + int width = strlen (f->name); + + scr_overlay_new (0, -1, width < 8+5 ? 8+5 : width, len + 1); + + r = SET_STYLE (OVERLAY_RSTYLE, GET_STYLE (r)); for (int y = 0; y < len; y++) { @@ -183,10 +193,12 @@ if (ch >= 0x10000) ch = 0xfffd; #endif - scr_overlay_set (11, y, ch); - scr_overlay_set (12, y, NOCHAR); + scr_overlay_set (11, y, ch, r); + scr_overlay_set (12, y, NOCHAR, r); } + scr_overlay_set (0, len, f->name); + #if ENABLE_COMBINING if (alloc) delete [] alloc; @@ -408,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); @@ -901,6 +913,8 @@ void rxvt_term::flush () { + flush_ev.stop (); + #ifdef TRANSPARENT if (want_full_refresh) { @@ -920,8 +934,6 @@ } display->flush (); - - flush_ev.stop (); } void @@ -1048,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 @@ -1139,10 +1152,9 @@ #ifdef MOUSE_REPORT_DOUBLECLICK key_state += ((MEvent.clicks > 1) ? 32 : 0); #endif - } -#ifdef DEBUG_MOUSEREPORT +#if DEBUG_MOUSEREPORT fprintf (stderr, "Mouse ["); if (key_state & 16) fputc ('C', stderr); @@ -1156,12 +1168,12 @@ button_number, x + 1, y + 1); -#else +#endif + tt_printf ("\033[M%c%c%c", (32 + button_number + key_state), (32 + x + 1), (32 + y + 1)); -#endif } #ifdef USING_W11LIB @@ -1208,14 +1220,9 @@ } #endif -#ifdef USE_XIM - if (XFilterEvent (&ev, None)) - return; -#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) { @@ -1229,7 +1236,7 @@ case KeyRelease: { -#if (defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING)) || defined (ENABLE_FRILLS) +#if (MOUSE_WHEEL && MOUSE_SLIP_WHEELING) || ISO_14755 KeySym ks; ks = XLookupKeysym (&ev.xkey, ev.xkey.state & ShiftMask ? 1 : 0); // sorry, only shift supported :/ @@ -1330,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 */ @@ -1390,9 +1394,7 @@ if (rs[Rs_fade]) { pix_colors = pix_colors_focused; - set_colorfgbg (); - scr_clear (); - scr_touch (true); + scr_recolour (); } #endif @@ -1404,6 +1406,13 @@ { TermWin.focus = 0; want_refresh = 1; + +#if ENABLE_FRILLS || ISO_14755 + iso14755buf = 0; +#endif +#if ENABLE_OVERLAY + scr_overlay_off (); +#endif #ifdef USE_XIM if (Input_Context != NULL) XUnsetICFocus (Input_Context); @@ -1417,12 +1426,9 @@ if (rs[Rs_fade]) { pix_colors = pix_colors_unfocused; - set_colorfgbg (); - scr_clear (); - scr_touch (true); + scr_recolour (); } #endif - } break; @@ -1440,15 +1446,14 @@ while (XCheckTypedWindowEvent (display->display, ev.xconfigure.window, ConfigureNotify, &ev)); if (szHint.width != width || szHint.height != height) - resize_all_windows (width, height, 1); + { + seen_resize = 1; + resize_all_windows (width, height, 1); + } #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; @@ -1466,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: @@ -1549,7 +1553,7 @@ break; } #endif - if ((priv_modes & PrivMode_mouse_report) && ! (bypass_keystate)) + if ((priv_modes & PrivMode_mouse_report) && !bypass_keystate) break; if (ev.xany.window == TermWin.vt) @@ -1562,8 +1566,8 @@ XQueryPointer (display->display, TermWin.vt, &unused_root, &unused_child, &unused_root_x, &unused_root_y, - & (ev.xbutton.x), & (ev.xbutton.y), - &unused_mask); + &ev.xbutton.x, &ev.xbutton.y, + &ev.xbutton.state); #ifdef MOUSE_THRESHOLD /* deal with a `jumpy' mouse */ if ((ev.xmotion.time - MEvent.time) > MOUSE_THRESHOLD) @@ -1578,7 +1582,8 @@ } #endif selection_extend (ev.xbutton.x, ev.xbutton.y, - (ev.xbutton.state & Button3Mask) ? 2 : 0); + ev.xbutton.state & Button3Mask ? 2 : 0); + #ifdef SELECTION_SCROLLING if (ev.xbutton.y < TermWin.int_bwidth || Pixel2Row (ev.xbutton.y) > (TermWin.nrow-1)) @@ -1599,7 +1604,7 @@ selection_save_state = (ev.xbutton.state & Button3Mask) ? 2 : 0; /* calc number of lines to scroll */ - if (ev.xbutton.ydisplay, scrollBar.win, - MotionNotify, &ev)) ; + MotionNotify, &ev)) + ; + XQueryPointer (display->display, scrollBar.win, &unused_root, &unused_child, &unused_root_x, &unused_root_y, - & (ev.xbutton.x), & (ev.xbutton.y), + &ev.xbutton.x, &ev.xbutton.y, &unused_mask); scr_move_to (scrollbar_position (ev.xbutton.y) - csrO, scrollbar_size ()); @@ -1702,6 +1709,7 @@ #endif clickintime = ev.time - MEvent.time < MULTICLICK_TIME; + if (reportmode) { /* mouse report from vt window */ @@ -1740,9 +1748,18 @@ { if (ev.button != MEvent.button) MEvent.clicks = 0; + switch (ev.button) { case Button1: + /* allow meta + click to select rectangular areas */ + /* should be done in screen.C */ +#if ENABLE_FRILLS + selection.rect = !! (ev.state & ModMetaMask); +#else + selection.rect = false; +#endif + /* allow shift+left click to extend selection */ if (ev.state & ShiftMask && ! (priv_modes & PrivMode_mouse_report)) { @@ -2394,6 +2411,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); @@ -2449,7 +2468,9 @@ } } - if (!am_pixmap_trans) + if (am_pixmap_trans) + XSetWindowBackgroundPixmap (display->display, TermWin.vt, ParentRelative); + else { unsigned int n; /* @@ -2517,15 +2538,20 @@ TermWin.parent[i] = None; } - // this is experimental if (scrollBar.win) { XSetWindowBackgroundPixmap (display->display, scrollBar.win, ParentRelative); - XClearWindow (display->display, scrollBar.win); scrollBar.setIdle (); scrollbar_show (0); } + if (am_transparent) + { + want_refresh = want_full_refresh = 1; + if (am_pixmap_trans) + flush (); + } + return pchanged; } #endif @@ -2559,7 +2585,11 @@ // they first read the screensize and then install a SIGWINCH handler. // some window managers resize the window early, and these programs // then sometimes get the size wrong. - kill (-cmd_pid, SIGWINCH); + // unfortunately other programs are even more buggy and dislike + // being sent SIGWINCH, so only do it when we were in fact being + // resized. + if (seen_resize) + kill (-cmd_pid, SIGWINCH); } /* Read a text string from the input buffer */ @@ -3489,46 +3519,47 @@ unsigned char * rxvt_term::get_to_st (unicode_t &ends_how) { - unicode_t prev = 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) { - if (prev == C0_ESC) + if (seen_esc) { if (ch == 0x5c) /* 7bit ST */ break; else return NULL; } + else if (ch == C0_ESC) + { + seen_esc = true; + continue; + } else if (ch == C0_BEL || ch == CHAR_ST) break; else if (ch < 0x20) return NULL; /* other control character - exit */ + seen_esc = false; + if (n >= sizeof (string) - 1) // stop at some sane length return NULL; if (ch == C0_SYN) - { - string[n++] = cmd_get8 (); - prev = 0; - } + string[n++] = cmd_get8 (); else - string[n++] = prev = ch; + string[n++] = ch; } 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); } /*----------------------------------------------------------------------*/ @@ -3622,6 +3653,7 @@ int color; char *buf, *name; bool query = str[0] == '?' && !str[1]; + int saveop = op; assert (str != NULL); switch (op) @@ -3638,7 +3670,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; @@ -3666,10 +3698,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], @@ -3723,6 +3752,9 @@ case XTerm_Color_BD: process_color_seq (XTerm_Color_BD, Color_BD, str, resp); break; + case XTerm_Color_IT: + process_color_seq (XTerm_Color_IT, Color_IT, str, resp); + break; case XTerm_Color_UL: process_color_seq (XTerm_Color_UL, Color_UL, str, resp); break; @@ -3730,6 +3762,14 @@ process_color_seq (XTerm_Color_RV, Color_RV, str, resp); break; #endif +#if TRANSPARENT && TINTING + case XTerm_Color_tint: + process_color_seq (XTerm_Color_tint, Color_tint, str, resp); + check_our_parents (); + if (am_transparent) + want_full_refresh = want_refresh = 1; + break; +#endif case XTerm_Pixmap: if (*str != ';') @@ -3769,13 +3809,26 @@ break; case XTerm_font: + op = URxvt_font; + case URxvt_font: +#if ENABLE_STYLES + case URxvt_boldFont: + case URxvt_italicFont: + case URxvt_boldItalicFont: +#endif if (query) - tt_printf ("\33]%d;%-.250s%c", XTerm_font, - (options & Opt_insecure) && TermWin.fontset->fontdesc - ? TermWin.fontset->fontdesc : "", + tt_printf ("\33]%d;%-.250s%c", saveop, + (options & Opt_insecure) && TermWin.fontset[op - URxvt_font]->fontdesc + ? TermWin.fontset[op - URxvt_font]->fontdesc : "", resp); else - change_font (str); + { + const char *&res = rs[Rs_font + (op - URxvt_font)]; + + res = strdup (str); + allocated.push_back ((void *)res); + set_fonts (); + } break; #if ENABLE_FRILLS @@ -3790,16 +3843,6 @@ # endif } break; - - case XTerm_findfont: - { - int fid = TermWin.fontset->find_font (atoi (str)); - tt_printf ("\33]%d;%d;%-.250s%c", XTerm_findfont, - fid, - (options & Opt_insecure) ? (*TermWin.fontset)[fid]->name : "", - resp); - } - break; #endif #ifdef MENUBAR @@ -3937,6 +3980,7 @@ switch (arg[i]) { case 1048: /* alternative cursor save */ + case 1049: if (options & Opt_secondaryScreen) if (mode == 0) scr_cursor (RESTORE); @@ -4071,8 +4115,10 @@ case 1: rendset = 1, rendstyle = RS_Bold; break; - //case 2: // faint or second colour - //case 3: // italic + //case 2: // low intensity + case 3: + rendset = 1, rendstyle = RS_Italic; + break; case 4: rendset = 1, rendstyle = RS_Uline; break; @@ -4094,20 +4140,22 @@ //... //case 19: // ninth alt font //case 20: // gothic - case 21: // disable bold, faint + case 21: // disable bold, faint, sometimes doubly underlined (iso 8613) rendset = 0, rendstyle = RS_Bold; break; - case 22: + case 22: // normal intensity rendset = 0, rendstyle = RS_Bold; break; - //case 23: disable italic + case 23: // disable italic + rendset = 0, rendstyle = RS_Italic; + break; case 24: rendset = 0, rendstyle = RS_Uline; break; case 25: rendset = 0, rendstyle = RS_Blink; break; - case 26: + case 26: // variable spacing (iso 8613) rendset = 0, rendstyle = RS_Blink; break; case 27: @@ -4135,15 +4183,13 @@ case 37: scr_color ((unsigned int) (minCOLOR + (arg[i] - 30)), Color_fg); break; -#ifdef TTY_256COLOR - case 38: + case 38: // set fg color, ISO 8613-6 if (nargs > i + 2 && arg[i + 1] == 5) { scr_color ((unsigned int) (minCOLOR + arg[i + 2]), Color_fg); i += 2; } break; -#endif case 39: /* default fg */ scr_color (Color_fg, Color_fg); break; @@ -4158,19 +4204,19 @@ case 47: scr_color ((unsigned int) (minCOLOR + (arg[i] - 40)), Color_bg); break; -#ifdef TTY_256COLOR - case 48: + case 48: // set bg color, ISO 8613-6 if (nargs > i + 2 && arg[i + 1] == 5) { scr_color ((unsigned int) (minCOLOR + arg[i + 2]), Color_bg); i += 2; } break; -#endif case 49: /* default bg */ scr_color (Color_bg, Color_bg); break; + //case 50: // not variable spacing + #ifndef NO_BRIGHTCOLOR case 90: case 91: /* set bright fg color */ @@ -4180,8 +4226,7 @@ case 95: case 96: case 97: - scr_color ((unsigned int) (minBrightCOLOR + (arg[i] - 90)), - Color_fg); + scr_color ((unsigned int) (minBrightCOLOR + (arg[i] - 90)), Color_fg); break; case 100: case 101: /* set bright bg color */ @@ -4191,8 +4236,7 @@ case 105: case 106: case 107: - scr_color ((unsigned int) (minBrightCOLOR + (arg[i] - 100)), - Color_bg); + scr_color ((unsigned int) (minBrightCOLOR + (arg[i] - 100)), Color_bg); break; #endif @@ -4241,60 +4285,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) { - enum { 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 (MAX_PTY_WRITE, v_buflen)); + 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; - - pty_ev.set (EVENT_READ); - return; - } + free (v_buffer); + v_buffer = 0; + v_buflen = 0; - 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) -----------------------*/