[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:5153] ring-bell-function 再び



藤井です。

[meadow-users-jp:5571]で報告した ring-bell-function の不具合の原因を確
認しているときに別のおかしな現象を発見しました。

Meadow を -q オプションを付けて起動して下記の式を評価した後、C-g を押
したままにした状態で、マウスホイールを回転させると現象が発生します。

(setq ring-bell-function
      (lambda () 
	(invert-face 'mode-line)
	(sit-for 0 50)
	(invert-face 'mode-line)))

この現象が発生すると、モードラインが反転されたままになってしまいます。
また、ring-bell-function が nil になっています。

この現象の原因を確認しようとしてみました。おおまかに以下のような流れで
現象が発生しているようです。

1. ring-bell-function 内の sit-for が呼び出される。
2. sit-for が ring_bell() を呼び出す。
3. sit-for 実行中に、マウスホイールのイベントが発生する。
   (このとき CTRL が押されているのでイベントは C-mouse-wheel1 である)
4. C-mouse-wheel1 は何にも割り当てられていないので、bitch_at_user() が
   呼び出され(command_loop_1()@keyboard.c)、ring_bell() が呼ばれる。

推測ですが、2. の ring_bell() の実行が終了してない状態で再び 4. の 
ring_bell() が呼び出されることが問題となっているように思います。


考えられる対策として、以下のものが考えつくのですが、どうするのが良いの
でしょう。

1. C-mouse-wheel1 などのモディファイア付きのイベントに何かのコマンドを
   割り当てる。
2. ring_bell() 実行時に ring_bell() が呼ばれないようにする。
   もしくはその状態で ring_bell() が呼び出されても問題ないように
   ring_bell() を変更する。

根本的解決となるのは 2. の方法だと思いますが、具体的にどうすれば良いか
はまだ考えていません。

--
藤井 正行 / Masayuki FUJII ( boochang@xxxxxxxxxxxx )