Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ubuntu 12.04 の gvim がまともに動かない #193

Closed
ynkdir opened this issue Apr 28, 2012 · 25 comments
Closed

Ubuntu 12.04 の gvim がまともに動かない #193

ynkdir opened this issue Apr 28, 2012 · 25 comments

Comments

@ynkdir
Copy link
Member

ynkdir commented Apr 28, 2012

他に同じ問題に当たった人が見当たらないのでなんとも言えませんが一応書いておきます。

Ubuntu 12.04 にアップデートしたら gtk gvim がまともに動かなくなりました。

症状は

  • 起動直後、ウィンドウを表示したところで1,2分止まる。
  • メニューがグローバルメニューに表示されない (ウィンドウにくっついてる)。
  • IM (ibus) で入力できない。

です。

念のため ubuntu クリーンインストールで vim-gtk パッケージで確認しましたがやはり動いてませんでした。

gvim -f で fork() を抑制すると正常に起動します。

うちの環境では GTK_IM_MODULE=ibus になってますが GTK_IM_MODULE=xim gvim にすることでも正常に起動します。ただし、この場合はメニューの問題は解決しません。

gtk + fork では以前にも同じようなことで修正がはいってたと思いますが関係するかどうかはわかりません。自分のとこではこの問題はでなかったので環境とかバージョンとかいろいろあるのかもしれません。もしかしたらそのうちパッケージの更新で直る問題なのかもしれません。ubuntu 11.10 ではちゃんと動いてたので vim の問題ともいいきれませんが他のアプリはちゃんと動いてるので気になります。

fork() の前に gtk_init_check() が呼ばれるのが原因のようですがさだかではありません。いちおう以下の変更で正常に起動するようにはなります。

diff -r 1be42b88900e src/main.c
--- a/src/main.c    Thu Apr 26 20:17:03 2012 +0200
+++ b/src/main.c    Sun Apr 29 00:03:11 2012 +0900
@@ -367,7 +367,7 @@
      */
     if (gui.starting)
     {
-   if (gui_init_check() == FAIL)
+   if (0 && gui_init_check() == FAIL)
    {
        gui.starting = FALSE;
@mattn
Copy link
Member

mattn commented Apr 28, 2012

さっきubuntu入れ終わった所です。再現しました。

@ynkdir
Copy link
Member Author

ynkdir commented Apr 29, 2012

確認ありがとうございます。
こまりましたね。。。

以前の話はおそらくこのへん
https://groups.google.com/d/topic/vim_dev/MUBFw65CRvE/discussion

@ynkdir
Copy link
Member Author

ynkdir commented Apr 29, 2012

わからないのでとりあえず投げてみました。
http://groups.google.com/group/vim_dev/browse_thread/thread/6d453c5f4a499d69

@ynkdir
Copy link
Member Author

ynkdir commented Apr 29, 2012

gvim in Precise can't connect to ibus and takes a long time to load
https://bugs.launchpad.net/ubuntu/+source/vim/+bug/987707

やっぱりibus関連の問題なんでしょうかね

@mattn
Copy link
Member

mattn commented May 1, 2012

ちょっといやらしいですね。こまった。

@mattn
Copy link
Member

mattn commented May 1, 2012

@mattn
Copy link
Member

mattn commented May 1, 2012

@Shougo
Copy link
Member

Shougo commented May 1, 2012

ちなみに、これは私の環境(Ubuntu 12.04)でもベータ版の時から再現していて、Ubuntuの人の話では「UbuntuのGlobal MenuとGVimの機能が干渉しているのではないか?」という話でした。

おそらく、以前修正した時と同様にVim本体側で対応する必要があります。
ただ、それで修正されたとして、またUbuntuのパッケージ側でのGVimのバージョンは変更されないおそれがあるので、そのあたりの対処は難しいですね。

@Shougo
Copy link
Member

Shougo commented May 1, 2012

fork() の前に gtk_init_check() が呼ばれるのが原因のようですがさだかではありません。いちおう以下の変更で正常に起動するようにはなります。

ここでタイムアウト待っているんですかね……。ちなみに、この現象は自分でコンパイルした最新版だろうが、@ynkdirさんのようにUbuntuのパッケージで用意されるバイナリを使用しようが再現します。

Ubuntu 12.04はLTSなので、今後使用者が増える前に対処したいところではあります。

@mattn
Copy link
Member

mattn commented May 1, 2012

僕はubuntuオリジナル提供のgvimだと再現しません。
昨日virtualboxに入れたやつでも同じでした。
なんとなくiBusが犯人な気がするのでvimではどうしようもないかもしれない。

ただ昨日試した限りだとグローバルメニューの構築がタイムアウトしたというメッセージが表示されてました。

@Shougo
Copy link
Member

Shougo commented May 2, 2012

ただ昨日試した限りだとグローバルメニューの構築がタイムアウトしたというメッセージが表示されてました。

私の環境でも同じです。

僕はubuntuオリジナル提供のgvimだと再現しません。
昨日virtualboxに入れたやつでも同じでした。

私が試したのは、Beta2のときでしたので、それから正式版になるまでにUbuntu側のGVimに何らかの修正が入った可能性があります。こちらの環境でも試してみたいと思います。Ubuntu側で修正した内容がわかれば、それをVim本体に取り込むことができるかもしれません。

@mattn
Copy link
Member

mattn commented May 2, 2012

おそらく、iBusが関連してか何かで fork する前に gtk_init もしくは gtk_init_check すると問題が発生するので以下の様にしてみました。

diff -r 273fbf501965 src/gui.c
--- a/src/gui.c Mon Apr 30 21:09:43 2012 +0200
+++ b/src/gui.c Tue May 01 19:32:14 2012 +0900
@@ -270,6 +270,12 @@
     }
     /* Child */

+#ifndef FEAT_GUI_GTK
+    /* Call gtk_init_check() here. See gui_init_check(). */
+    if (gui_mch_init_check() != OK)
+   exit(1);
+#endif
+
 # if defined(HAVE_SETSID) || defined(HAVE_SETPGID)
     /*
      * Change our process group.  On some systems/shells a CTRL-C in the
@@ -430,7 +436,16 @@
 #ifdef ALWAYS_USE_GUI
     result = OK;
 #else
+# ifdef FEAT_GUI_GTK
+    /*
+     * Note: Don't call gtk_init(), gtk_init_check() before fork.
+     * This will be called after the fork. When calling that before fork,
+     * it make vim hang for a while. See gui_do_fork().
+     */
+    result = gui.dofork ? OK : gui_mch_init_check();
+# else
     result = gui_mch_init_check();
+# endif
 #endif
     return result;
 }

-gf された場合(gui.dofork==FALSEの場合)、はフォアグラウンド確定なので親プロセス側で gtk_init_check() を呼び出し、そうで無い、つまりは個プロセスを起動するのが確定している場合は gtk_init_check() は呼び出さず、fork() された後で呼ぶはずだった gtk_init_check() を呼び出しています。

一応、簡単な動作確認をやった限りだと動いてそうです。
人柱希望。

@mattn
Copy link
Member

mattn commented May 2, 2012

これは今後の為にも NOTE: コメントがいるなー。
あと他のGUI向けのコードを変えちゃってるのを戻さなきゃ。

@mattn
Copy link
Member

mattn commented May 2, 2012

コメント入れて修正しました。

@Shougo
Copy link
Member

Shougo commented May 2, 2012

mattn++;

@ynkdir
Copy link
Member Author

ynkdir commented May 2, 2012

ありがとうございます。試しました。問題なく動いてます。

https://bugs.launchpad.net/ubuntu/+source/vim/+bug/987707
ここで詳しそうな人が解説してますが
gtk_init() で dbus 通信用のスレッドを作っていて
fork() (とおそらくexit()) するとそのスレッドが死んでしまうということらしいです。
固まるかどうかの違いは待ち処理の違いかなんかでしょうかね。

@mattn
Copy link
Member

mattn commented May 2, 2012

ふむ。じゃぁこのままpatch送っちゃいますか。

@mattn
Copy link
Member

mattn commented May 2, 2012

@ynkdir
Copy link
Member Author

ynkdir commented May 8, 2012

手パッチで自動補正されてました。失礼しました。

@mattn
Copy link
Member

mattn commented May 8, 2012

実は僕も、virtualpc 上で動作確認して、gistに貼れる術がなくて(設定がめんどくさくて)、手元のwindowsでパッチ当てた際に失敗してました。

@thinca
Copy link
Member

thinca commented May 18, 2012

7.3.520で+αされて取り込まれました。

https://groups.google.com/d/topic/vim_dev/BniVlM5XaZU/discussion

@thinca thinca closed this as completed May 18, 2012
@Shougo
Copy link
Member

Shougo commented May 19, 2012

連絡ありがとうございます。

@mattn
Copy link
Member

mattn commented May 21, 2012

guioptionsにfがある状態で-gするとgtk_init_checkが走らないという問題があったのでパッチ追加。

@h-east
Copy link
Member

h-east commented May 22, 2012

@mattn Great. お疲れ様でした。

@mattn
Copy link
Member

mattn commented May 25, 2012

guioptionsにfがある時の修正も完了。

いまから思えば #85 もそれだったんじゃないかと思った。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants