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