--- rclock/rclock.c +++ rclock/rclock.c @@ -1201,8 +1201,16 @@ int n = (sizeof(execPrgm) - strlen (execPrgm) - 2); if ((n > 0) && (n >= strlen (prgm))) { - /* for co-occurring programs */ - strcat (execPrgm, ";"); + /* for co-occurring programs */ + switch (execPrgm[strlen (execPrgm)-1]) + { + case '&': + case ';': + break; + default: + strcat (execPrgm, ";"); + break; + } strncat (execPrgm, prgm, n); } } --- src/command.c +++ src/command.c @@ -1221,11 +1221,23 @@ ^ !!(shft | ctrl)) ? '\b' : '\177'); } else len = strlen(STRCPY(kbuf, key_backspace)); +#ifdef MULTICHAR_SET + if ((Options & Opt_mc_hack) && scr_multi2()) { + memmove(kbuf + len, kbuf, len); + len *= 2; + } +#endif break; #endif #ifndef NO_DELETE_KEY case XK_Delete: len = strlen(STRCPY(kbuf, key_delete)); +#ifdef MULTICHAR_SET + if ((Options & Opt_mc_hack) && scr_multi1()) { + memmove(kbuf + len, kbuf, len); + len *= 2; + } +#endif break; #endif case XK_Tab: @@ -1279,6 +1291,14 @@ kbuf[2] = ("dacb"[keysym - XK_Left]); } else if (PrivateModes & PrivMode_aplCUR) kbuf[1] = 'O'; +#ifdef MULTICHAR_SET + if ((Options & Opt_mc_hack) && + ((keysym==XK_Left && scr_multi2()) || + (keysym==XK_Right && scr_multi1()))) { + memmove(kbuf + len, kbuf, len); + len *= 2; + } +#endif break; #ifndef UNSHIFTED_SCROLLKEYS --- src/rxvt.h +++ src/rxvt.h @@ -408,6 +408,7 @@ #define Opt_scrollTtyOutput (1LU<<11) #define Opt_scrollKeypress (1LU<<12) #define Opt_transparent (1LU<<13) +#define Opt_mc_hack (1LU<<14) /* place holder used for parsing command-line options */ #define Opt_Reverse (1LU<<30) #define Opt_Boolean (1LU<<31) @@ -548,6 +549,9 @@ #ifdef USE_XIM Rs_preeditType, Rs_inputMethod, +#endif +#ifdef MULTICHAR_SET + Rs_mc_hack, #endif #if defined (HOTKEY_CTRL) || defined (HOTKEY_META) Rs_bigfont_key, --- src/screen.c.orig Fri Jul 14 11:29:29 2000 +++ src/screen.c Sat Dec 23 13:49:05 2000 @@ -1980,15 +1980,15 @@ int scr_move_to(int y, int len) { - int start; + int start, newstart; want_refresh = 1; start = TermWin.view_start; if (y >= len) TermWin.view_start = 0; else { - TermWin.view_start = ((len - y) - * (TermWin.nrow - 1 + TermWin.nscrolled) / len); + newstart = ((len - y) * (TermWin.nrow - 1 + TermWin.nscrolled) / len); + TermWin.view_start = max(newstart,0); if (TermWin.view_start < TermWin.nrow) TermWin.view_start = 0; else @@ -3501,5 +3501,28 @@ XGetWindowAttributes(Xdisplay, TermWin.vt, &xwa); pos->x = Col2Pixel(screen.cur.col) + xwa.x; pos->y = Height2Pixel((screen.cur.row + 1)) + xwa.y; +} +#endif + +#ifdef MULTICHAR_SET +/* EXTPROTO */ +int +scr_multi1(void) +{ + rend_t rend; + + rend = screen.rend[screen.cur.row + TermWin.saveLines][screen.cur.col]; + return ((rend & RS_multiMask)==RS_multi1); +} + +/* EXTPROTO */ +int +scr_multi2(void) +{ + rend_t rend; + + if (screen.cur.col==0) return 0; + rend = screen.rend[screen.cur.row + TermWin.saveLines][screen.cur.col-1]; + return ((rend & RS_multiMask)==RS_multi2); } #endif --- src/xdefaults.c +++ src/xdefaults.c @@ -215,6 +215,8 @@ #ifdef MULTICHAR_SET STRG(Rs_multichar_encoding, "multichar_encoding", "km", "mode", "multiple-character font encoding; mode = eucj | sjis | big5 | gb"), + BOOL(Rs_mc_hack, "multibyte_cursor", "mcc", Opt_mc_hack, + "Multibyte character cursor movement"), #endif /* MULTICHAR_SET */ #ifdef USE_XIM STRG(Rs_preeditType, "preeditType", "pt", "style",