Vine Linux バグトラッキングシステム - Vine Linux
課題の詳細を表示
0000511Vine Linux1 バグ公開2007-04-06 02:412008-04-06 01:18
anonymous 
 
不明 
完了却下 
4.1 
 
gedit, rox-filer
0000511: VJE+GEdit or rox filerでシフトkeyを押しただけでhang upする
症状:
geditもしくはrox-filerとvjeの組み合わせで、
text area上でshift, ctrl key等を単独で押しただけで
プログラムがhangしcpuの使用率が100%となり
強制終了させるしか方法がなくなる。

起きる場合と起きない場合の例は
* vjeがなければおきない
* uimだとおきない(immoduleがximでないので当然か?)
* 英数字は入力できる
* ctrl, shift, esc keyは押しただけでhang
* 日本語入力モードのとき未確定文字が
ある時はescを押してもhangしない。

ということで、明らかにwidgetもinput methodも必要
していないkey入力(つまり、key_press_eventや
gtk_filter_key_eventでfalseが返される)の場合にhangします。

geditもrox-filerもkey_press_eventの処理に共通点があって、
gdbで追ってみると、geditの場合、gedit_window.cの
gedit_window_key_press_event()の中で最後にparent widgetに
eventをpropagateさせた後、parent widgetの中で再び
event queueにkey eventが戻されるようで(何故?)、
また、全く同じkey eventで
gedit_window_key_press_event()が呼び出されます。
このため無限ループに陥っています(stackは消費しないので
永遠です。。。)

とてもgtkのlib内や、ましてvjeの中は追えないので、これ
以上の事は判りませんが、おそらくどちらにも問題がある
と思われます。

対策:
本質的な理由が判らないので次善の策しかない訳ですが、
少なくとも同じtime stampの同じGdkKeyEventが何度も
gedit_window_key_press_event()に渡される事は通常
絶他にないわけです。ですから、
gedit_window_key_press_event()に

if (prev_event.hardware_keycode == event->hardware_keycode &&
    prev_event.state == event->state &&
    prev_event.time == event->time)
           return TRUE;
prev_event = *event;

なる処理を
GTK_WIDGET_CLASS (gedit_window_parent_class)->key_press_event
(widget, event);
呼び出しの直前におけば問題なく使えるようになります。
rox-filerの場合もfiler.cの中のkey_press_event処理の部分
に全く同様の処理を追加すると、問題なく使えます。もちろん
もともと起き得ない事に対する処理なので他に影響は
ないと思います。

VJEはもうサポートされていないとはいえ、Vine 3.0にバンドル
されていたわけですし、使いやすいので気に入っています。
また、これ以外では問題もなく使える良いfepです。これらの
プログラムでも(特にrox-filer)使えるように
なると良いのですが。。。
設定されていません。
課題の履歴
2007-04-06 02:41anonymous新規課題
2008-04-06 01:18kazutaka状態新規 => 完了
2008-04-06 01:18kazutaka解決状況不明 => 却下
2008-04-06 01:18kazutakaコメント追加: 0002531

コメント
(0002531)
kazutaka   
2008-04-06 01:18   
> 症状:
> geditもしくはrox-filerとvjeの組み合わせで、
> text area上でshift, ctrl key等を単独で押しただけで
> プログラムがhangしcpuの使用率が100%となり
> 強制終了させるしか方法がなくなる。

既に最初の投稿からかなり時間が経っていますが、
どなたからもリプライいただけないようなので、
残念ですが却下とします。