[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:17243] Solution of "emacs20 on X11 has bug?"
たけ@阪大です。長文です。
以前、[debian-users:16526] で、
「Ctrl-k を押すと落ちる」という内容のメールをだしました。
あれからも、時々それが起こるので、原因を究明してみました。
~~~~ -> 重要。再現性が低いようであった。
# 一応、-devel にも投げてみますが、subscribe をこのメールアドレスで
# してないので、届くか不安。出来たら、-users で続けたいです。
落ちる時に出すメッセージが、
X protocol error: BadMatch (invalid parameter attributes) on protocol request 18
であること(request 18 = X_ChangeProperty)から、XChangeProperty 関係を
探ってみると、マウスでのセレクション関係が原因のようでした。
カットバッファは全部で 8 つあります。これら全ての type が、
XA_STRING だと正常に使えるのですが、どれかに、XA_COMPOUND_TEXT のような、
非 XA_STRING が交じっていると落ちるようです。
kterm 上で日本語を入力なり、表示なりして、日本語部分のみをマウスで
(重要。ASCII で終ると再現しません) <- ~~~~~~~~~~~~~~
セレクション(反転させることです。ドラッグすればOK)してみてください。
そして、その状態で、emacs を立ち上げて、マウスで、セレクションするなり、
Ctrl-k を押すなりすれば、確実に前述のメッセージを吐いて、落ちます。
僕のところでは、再現性 100% になりました。
参考までに、現在のカットバッファ 8 つの type と format を調べる
プログラムと、カットバッファ全てを強制的に XA_STRING にするプログラム
を付けておきます。
皆様、追試の方をお願い致します。
と、ここまで書いて判明したのですが、kterm 上でも、「emacs -nw を
実行し、emacs 上で、日本語をセレクションする」と COMPOUND_TEXT に
ならないみたい。jless とかで表示するとか、単純に、kinput2 を使って
シェルのコマンドラインに日本語を入力して、セレクションすると
COMPOUND_TEXT になるのだが。
emacs では COMPOUND_TEXT を生成しないようにしているのであろうか?
まぁ、どのみち、COMPOUND_TEXT が原因という結論に変わりはなさそうですが。
# 後者のプログラムがあれば、いつでも正常に X で emacs を使えるわけだが、
# 根本的な解決策としては、emacs-source-???/src/xselect.c の、
# initialize_cut_buffers() の、XChangeProperty の引数を、問題なければ、
# PropModeAppend から、PropModeReplace に変えることかな?
# どうでしょう。
------------------
武 靖浩
大阪大学医学部医学科 学II
E-mail: redstar@xxxxxxxxxxxxx
ytake@xxxxxxxxxxxxxxxxxxxxxxx
mm6051ty@xxxxxxxxxxxxxxxxxxxxx
URL: http://plaza.harmonix.ne.jp/~redstar
------------------
----------- show_type.c ------------
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
int main()
{
Display *dpy;
Window window;
int i;
Atom type_r;
int format_r;
unsigned long nitems_r, bytes_after_r;
unsigned char *prop_r;
dpy = XOpenDisplay(NULL);
window = RootWindow(dpy, 0);
for (i = 9; i < 17; i++) {
printf("i = %d\n", i);
XGetWindowProperty(dpy, window, (Atom)i, 0, 4, False, XA_STRING,
&type_r, &format_r, &nitems_r, &bytes_after_r,
&prop_r);
printf(" type = %d format = %d str = %s\n", type_r, format_r,
XGetAtomName(dpy, type_r));
}
exit(0);
}
--------------- end ---------------
--------------- reset_type.c ---------------
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
int main()
{
Display *dpy;
Window window;
int i;
unsigned char *data = "";
dpy = XOpenDisplay(NULL);
window = RootWindow(dpy, 0);
for (i = 9; i < 17; i++) {
printf("i = %d\n", i);
XChangeProperty(dpy, window, (Atom)i, XA_STRING, 8, PropModeReplace,
data, 0);
}
XFlush(dpy);
exit(0);
}
--------------- end ----------------