[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:5153] ring-bell-function 再び
- X-ml-count: 5153
- Subject: [MD:5153] ring-bell-function 再び
- From: "M.Fujii" <boochang@xxxxxxxxxxxx>
- Date: Mon, 28 Jun 2004 21:13:34 +0900 (JST)
- X-mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI)
藤井です。
[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 )