--- rxvt-unicode/src/command.C 2004/08/25 03:47:20 1.163 +++ rxvt-unicode/src/command.C 2005/01/26 07:08:15 1.191 @@ -50,7 +50,12 @@ #include "version.h" #include "command.h" -#include +#ifdef KEYSYM_RESOURCE +# include "keyboard.h" +#endif + +#include +#include /*----------------------------------------------------------------------*/ @@ -345,6 +350,11 @@ if (valid_keysym) { +#ifdef KEYSYM_RESOURCE + if (keyboard->dispatch (this, keysym, ev.state)) + return; +#endif + if (TermWin.saveLines) { #ifdef UNSHIFTED_SCROLLKEYS @@ -419,7 +429,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); @@ -488,31 +498,6 @@ if (keysym >= 0xFF00 && keysym <= 0xFFFF) { -#ifdef KEYSYM_RESOURCE - if (! (shft | ctrl) && Keysym_map[keysym & 0xFF] != NULL) - { - unsigned int l; - const unsigned char *kbuf0; - - kbuf0 = (Keysym_map[keysym & 0xFF]); - l = (unsigned int)*kbuf0++; - - /* escape prefix */ - if (meta -# ifdef META8_OPTION - && meta_char == C0_ESC -# endif - ) - { - const unsigned char ch = C0_ESC; - tt_write (&ch, 1); - } - - tt_write (kbuf0, l); - return; - } - else -#endif { newlen = 1; switch (keysym) @@ -789,6 +774,7 @@ newlen = 0; break; } + if (newlen) len = strlen (kbuf); } @@ -807,6 +793,11 @@ len = 1; kbuf[0] = '\037'; /* Ctrl-Minus generates ^_ (31) */ } + else if (keysym == XK_ISO_Left_Tab) + { + strcpy (kbuf, "\033[Z"); + len = 3; + } else { #ifdef META8_OPTION @@ -874,7 +865,7 @@ } /*}}} */ -#if (MENUBAR_MAX) +#if MENUBAR_MAX || defined (KEYSYM_RESOURCE) /*{{{ rxvt_cmd_write (), rxvt_cmd_getc () */ /* attempt to `write' count to the input buffer */ unsigned int @@ -907,11 +898,13 @@ return 0; } -#endif /* MENUBAR_MAX */ +#endif void rxvt_term::flush () { + flush_ev.stop (); + #ifdef TRANSPARENT if (want_full_refresh) { @@ -931,8 +924,6 @@ } display->flush (); - - flush_ev.stop (); } void @@ -1018,6 +1009,10 @@ || mouse_slip_wheel_speed < 0 ? scr_page (DN, -mouse_slip_wheel_speed) : scr_page (UP, mouse_slip_wheel_speed)) { + if (TermWin.view_start == TermWin.nscrolled || + TermWin.view_start == 0) + mouse_slip_wheel_speed = 0; + refresh_type |= SMOOTH_REFRESH; want_refresh = 1; w.start (w.at + SCROLLBAR_CONTINUOUS_DELAY); @@ -1059,13 +1054,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 @@ -1089,7 +1085,7 @@ if (! (options & Opt_pointerBlank)) return; - XDefineCursor (display->display, TermWin.vt, blank_cursor); + XDefineCursor (display->display, TermWin.vt, display->blank_cursor); XFlush (display->display); hidden_pointer = 1; @@ -1218,14 +1214,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) { @@ -1340,12 +1331,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 */ @@ -1459,11 +1447,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; @@ -1481,8 +1465,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: @@ -1564,7 +1547,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) @@ -1577,8 +1560,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) @@ -1593,7 +1576,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)) @@ -1614,7 +1598,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 ()); @@ -1678,10 +1664,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 */ @@ -1717,6 +1701,7 @@ #endif clickintime = ev.time - MEvent.time < MULTICLICK_TIME; + if (reportmode) { /* mouse report from vt window */ @@ -1755,9 +1740,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)) { @@ -2351,14 +2345,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); @@ -2409,6 +2403,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); @@ -2464,7 +2460,9 @@ } } - if (!am_pixmap_trans) + if (am_pixmap_trans) + XSetWindowBackgroundPixmap (display->display, TermWin.vt, ParentRelative); + else { unsigned int n; /* @@ -2539,6 +2537,13 @@ scrollbar_show (0); } + if (am_transparent) + { + want_refresh = want_full_refresh = 1; + if (am_pixmap_trans) + flush (); + } + return pchanged; } #endif @@ -2698,7 +2703,7 @@ // assume wchar == unicode cmdbuf_ptr += len; - return wc; + return wc & UNICODE_MASK; } return NOCHAR; @@ -3506,10 +3511,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) { @@ -3522,7 +3527,7 @@ } else if (ch == C0_ESC) { - seen_esc = 1; + seen_esc = true; continue; } else if (ch == C0_BEL || ch == CHAR_ST) @@ -3530,7 +3535,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 @@ -3544,12 +3549,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); } /*----------------------------------------------------------------------*/ @@ -3660,7 +3662,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; @@ -3688,10 +3690,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], @@ -3755,7 +3754,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 (); @@ -3779,8 +3778,8 @@ #if XPM_BACKGROUND changed += scale_pixmap (str); #endif - } + if (changed) { #ifdef XPM_BACKGROUND @@ -3831,6 +3830,7 @@ else { set_locale (str); + pty.set_utf8_mode (enc_utf8); # ifdef USE_XIM im_cb (); # endif @@ -4278,60 +4278,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) -----------------------*/