[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;
}