[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:02569] mule->rxvt paste patch



きくたにです。

Tue, Oct 28, 1997 at 05:55:30PM +0900 において
Kikutani Makoto 曰く:

> >  > ところで、muleからrxvtにcopy&pasteできない件ですが、
> >  > 以下をあてれば、一応できるようになります。日本語はだめみたいですが。
> >  > (rxvtの最新は
> >  > ftp://ftp.math.fu-berlin.de/pub/rxvt/devel/rxvt-2.4.3.tar.gz )
> > 
> > バージョンが上がっていたのですか。get してパッチをあてて
> > みると確かに mule からコピーできました。
> > ただやはり日本語は化け(?)ていました。
> 
> 誰か日本語も化けずにpasteできるパッチを作ってくれると嬉しいです。

とりあえず、EUC環境ではできるようにしてみました。
Muleから来るのはJISなんで、いったんEUCにするといいらしい。
でも、なんだかここまでやるのは無駄な気もしますね。

あと、ktermやxclipboardからも日本語はpasteできないことに気づきましたが、
こっちはちょっとめんどうそう。

-- 
人生を背負い投げ

菊谷 誠(Kikutani Makoto)  kikutani@xxxxxxxxx kikutani@xxxxxxxxxxxxxxx
hgf03701@xxxxxxxxxxxxxxxx    http://www.eis.or.jp/muse/kikutani/
--- screen.c.orig	Thu Oct 23 12:26:24 1997
+++ screen.c	Thu Oct 30 12:09:26 1997
@@ -2332,6 +2332,51 @@
     }
 }
 
+#if defined(KANJI)
+void jis2eucj(unsigned char *d, unsigned char *s, int dlen)
+{
+   unsigned char c1, c2, *seq;
+   int k = 0, l = 0;
+
+   while( ((c1 = *s++) != 0) && l < dlen ) {
+      if (c1 & 0x80) { /* euc ? */
+	 *d++ = c1;
+	 continue;
+      } else if (0x1b == c1) {
+	 seq = s;
+	 if (*seq == '$') {
+	    seq++;
+	    if (*seq == '(') seq++;
+	    if (*seq == '@' || *seq == 'B') {
+	       k = 1;
+	       s = seq + 1;
+	       continue;
+	    }
+	 } else if (*s == '(') {
+	    seq++;
+	    if (*seq == 'B' || *seq == 'H' || *seq == 'J' ) {
+	       k = 0;
+	       s += 2;
+	       continue;
+	    }
+	 }
+      }
+      if (0 == k) {
+	 *d++ = c1;
+	 l++;
+	 continue;
+      }
+      c2 = *s++;
+      if (c2 == 0x1b || c2 == 0) break;
+      if (l + 2 >= dlen) break;
+      *d++ = c1 | 0x80;
+      *d++ = c2 | 0x80;
+      l += 2;
+   }
+   *d = 0;
+}
+#endif
+
 /* ------------------------------------------------------------------------- */
 /*
  * Paste a selection direct to the command
@@ -2342,19 +2387,43 @@
 {
     int             num;
     unsigned char  *p, cr;
+#if defined(KANJI)
+   unsigned char *jstr;
+#endif
 
     cr = '\r';
     for (p = data, num = 0; nitems--; p++)
 	if (*p != '\n')
 	    num++;
 	else {
+#if defined(KANJI)
+	   jstr = (unsigned char *) malloc(num+1);
+	   strncpy(jstr, data, num);
+	   *(jstr+num) = '\0';
+	   jis2eucj(data, jstr, strlen(data)); 
+	   free(jstr);
+	   tt_write(data, strlen(data));
+#else
 	    tt_write(data, num);
+#endif
 	    tt_write(&cr, 1);
 	    data += (num + 1);
 	    num = 0;
 	}
     if (num)
+#if defined(KANJI)
+     {
+	jstr = (unsigned char *) malloc(num+1);
+	strncpy(jstr, data, num);
+	*(jstr+num) = '\0';
+	jis2eucj(data, jstr, strlen(data));
+	free(jstr);
+	num = strlen(data);
+#endif
 	tt_write(data, num);
+#if defined(KANJI)
+     }
+#endif
 }
 
 /* ------------------------------------------------------------------------- */
@@ -2377,7 +2446,7 @@
 	if ((XGetWindowProperty(Xdisplay, win, prop, (nread / 4), PROP_SIZE,
 			  Delete, AnyPropertyType, &actual_type, &actual_fmt,
 				&nitems, &bytes_after, &data) != Success)
-	    || (actual_type != XA_STRING)) {
+	    ) {
 	    XFree(data);
 	    return;
 	}