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

WindowsのgVimでスクロールするとゴミが残る #715

Closed
yoheie opened this issue Mar 17, 2015 · 80 comments
Closed

WindowsのgVimでスクロールするとゴミが残る #715

yoheie opened this issue Mar 17, 2015 · 80 comments

Comments

@yoheie
Copy link

yoheie commented Mar 17, 2015

WindowsのgVimでホイールスクロールすると、別の行の文字がゴミとして残ってしまう場合があります。

発生条件はまだ明確になっていない。ウィンドウを分割した下の方で出やすい気がするけど気のせいかもしれない。
カーソルがいた場所にあった文字が、マウスホイールでスクロールした後の場所に表示として残ってしまうことがある、という現象のようだ。
今のところ、水平分割したウィンドウでしか発生していない。それとマウスホイールでのスクロールのみで、hjklとかでは発生していない。
ウィンドウ分割は関係ないようだ。行数が特定の範囲の時に発生するっぽい。

カーソルがいた場所にあった文字が、マウスホイールでスクロールした後の場所に表示として残ってしまっているようです。

確認環境:

  • OS : Windows 7 32bit
  • Vimのバージョン : 7.4.648 Kaoriya版

確認手順:

  1. 各行の文字数が揃っていないテキストファイルをgVimで開く。
  2. $でカーソルを行末へ移動。
  3. 適当にホイールスクロールする。

表示行数が一定の範囲内のとき発生するようです。
私の環境ではホイールスクロールの行数が5行になっていて、表示行数が8行〜33行のときに発生しています。

_vimrc・_gvimrcは消した状態でも発生しています。

@mattn
Copy link
Member

mattn commented Mar 17, 2015

お手数ですが test.txt を頂けますか。

@mattn
Copy link
Member

mattn commented Mar 17, 2015

いくらか引用させて頂きました。問題ありましたら消しますのでご指摘下さい。

@yoheie
Copy link
Author

yoheie commented Mar 17, 2015

お手数ですが test.txt を頂けますか。

gist に置いておきました。

https://gist.github.com/yoheie/7c12e39e512104efb527

@mattn
Copy link
Member

mattn commented Mar 17, 2015

うむ。僕の環境では再現しなかったでです。
OS : Windows 7 32bit
自家製ビルド
誰か他の人、再現確認してもえらますか。

@hokorobi
Copy link

僕の環境でも再現しませんでした。
OS : Windows 7 64bit
Vimのバージョン : 7.4.648 Kaoriya版

@mattn
Copy link
Member

mattn commented Mar 17, 2015

@yoheie 何かオプションが絡んでませんか?gvim -u NONE -N test.txt で確認して頂けますか。

@LeafCage
Copy link

私はメイリオを使っていたときにその問題に悩まされた記憶があります。
フォントを変更してMigu_1Mを使うことで発生しなくなりました。
相性の悪いフォントがあるのだと思います。
yoheieさんの 'guifont' オプションの値を教えてもらいたいですね。

@yoheie
Copy link
Author

yoheie commented Mar 17, 2015

あらためて確認しましたところ、全く同じ設定でも別のPCでは問題が発生しませんでした。
発生するPCでは gvim -u NONE -N test.txt でも発生します。
guifontはどちらの環境でもMS_Gothic:h10:cSHIFTJISです。

特定の環境でしか発生しないことが分かりましたので、まずは私の方で環境側の要因を調べてみます。

@yoheie
Copy link
Author

yoheie commented Mar 21, 2015

経過報告です。

現時点で問題が発生する PC は 2台、発生しない PC は 2台です。 4台とも Windows 7 32bit です。
(発生する PC はいずれも Professional 、発生しない PC はいずれも Ultimate ですが、これは多分関係ないでしょう…)
発生する環境側要因はまだ明らかになっていません。

問題が発生する 2台目の PC では、ホイールスクロールの行数は 3行で、表示行数が6~38行のときに発生します。

guifont は下記を試しましたが、どのフォントでも発生します。
(gvim -u NONE -N test.txt で起動、 set guifont= でフォントを変更後ホイールスクロールして確認)

  • MS_Gothic
  • MS_Mincho
  • Terminal
  • IPAゴシック
  • IPA明朝
  • Migu_1M

@koron
Copy link
Member

koron commented Mar 21, 2015

renderoptionsでDirectX使ってますか?

@koron
Copy link
Member

koron commented Mar 21, 2015

ああ -u NONE でも発生するのか。スマンす。

@koron
Copy link
Member

koron commented Mar 21, 2015

@yoheie 関係ないかもですが、グラフィックカードのメーカー(チップ)やドライバーのバージョン番号って、わかりませんかね?

発生する環境には、何か共通項があるんじゃないかと推測しています。

@koron
Copy link
Member

koron commented Mar 21, 2015

問題が発生する PC は 2台、発生しない PC は 2台です。 4台とも Windows 7 32bit です。
発生する PC はいずれも Professional 、発生しない PC はいずれも Ultimate です

って、これ関係あるんじゃないかな… 綺麗に分かれてるんだし。

@yoheie
Copy link
Author

yoheie commented Mar 21, 2015

すみません、その後調べていたらUltimateの1台でも出ました…
グラフィックは、問題の出るPCは全部Intelでした。
チップやドライバのバージョンはバラバラだったと思いますが、今すぐ確認できるPCが1台だけなのでまた後で確認します。

@yoheie
Copy link
Author

yoheie commented Mar 23, 2015

問題が出る環境:

  • Intel(R) HD Graphics Family 8.15.10.2418
  • Intel(R) G45/G43 Express Chipset 8.15.10.2119
  • Mobile Intel(R) 4 Series Express Chipset Family 8.15.10.1883

問題が出ていない環境:

  • NVIDIA GeForce 7600 GS 9.18.13.908

でした。

@koron
Copy link
Member

koron commented Mar 23, 2015

つまり Intel か。私もあとで試してみます。

@koron
Copy link
Member

koron commented Mar 24, 2015

とりあえず以下の環境で試したが再現しなかった (´・ω・`)

  • Windows 7 64bit
  • Intel(R) HD Graphics 4000 (ドライバー 10.18.10.3958)
  • Vim 7.4.674 +kaoriya (snapshot版)

ドライバーのバージョンかしら?

@koron
Copy link
Member

koron commented Mar 24, 2015

ちなみに最新のドライバーは 15.X とかみたいw

@yoheie
Copy link
Author

yoheie commented Mar 24, 2015

考えられるのは

  • ドライバのバージョンにも依存
  • 32bit版のみで発生
  • 実はまったく別の原因が存在

といったところでしょうか。

@mattn
Copy link
Member

mattn commented Mar 24, 2015

@yoheie マウスはOEM提供ドライバでしょうか?物によっては WM_MOUSEHWHEEL だったりスクロールバーにメッセージを送ったりする物だったり色々だった気がします。

@tyochiai
Copy link

64 bit 版で起きてるので環境投下します。
(gvim -u NONE -N test.txt にて確認)

  • Windows 8.1 Pro 64 bit
  • Intel(R) HD Graphics 4600 (ドライバー 10.18.10.3621)
  • Kaoriya Vim 64 bit 版 (適用済みパッチ: 1-648)

マウスのドライバは OS のをそのまま使ってるみたいです。

@yoheie
Copy link
Author

yoheie commented Mar 24, 2015

マウスのドライバは、発生しないPCと発生するPCのうちの1台はメーカー独自、残りの2台はWindows標準のものです。

別の要因、あるいは複合的な要因である可能性を考えて、私の確認した4台で発生する環境と発生しない環境の相違点を調べてみました。

  • Microsoft Office (2007 or 2010) がインストールされている
  • Visual Studio (Express 2010・2012・2013) がインストールされている

が候補として挙げられるかもしれません。

@yoheie
Copy link
Author

yoheie commented Apr 28, 2015

ご報告が遅くなってしまいましたが、

Microsoft Office (2007 or 2010) がインストールされている
Visual Studio (Express 2010・2012・2013) がインストールされている

これらにつきましては未インストールのPCで発生することを確認しました。
やはり共通点はIntelのグラフィックということになりそうです。

@yoheie
Copy link
Author

yoheie commented Sep 3, 2015

だいぶ経ってしまいましたが追加情報です。

  • ホイールスクロールだけでなくスクロールバーによるスクロールでも発生します。
  • vim.org で公開されている gvim74.zip の gvim.exe でも発生します。

@yoheie yoheie closed this as completed Sep 3, 2015
@yoheie yoheie reopened this Sep 3, 2015
@yoheie yoheie changed the title WindowsのgVimでホイールスクロールするとゴミが残る WindowsのgVimでスクロールするとゴミが残る Sep 3, 2015
@yoheie
Copy link
Author

yoheie commented Sep 3, 2015

すみません、間違って閉じちゃったので開き直しました…
ホイールスクロールに限らないのでタイトルを修正しました。

@mattn
Copy link
Member

mattn commented Sep 7, 2015

たぶん家のノートで再現しなかったの、ホイールを使わなかったからだと思います。

@h-east
Copy link
Member

h-east commented Sep 7, 2015

@yoheie 👍 素晴らしい!
patch提出時は gui_intel_gpu_workaround()のプロトタイプ宣言は src/proto/gui_w16.progui_w32.pro にそれぞれ書いた方が良いと思います。(16 + 32 = 48 ですんで)

@mattn
Copy link
Member

mattn commented Sep 7, 2015

てかこのまま vim-dev に持って行ってはたして取り込んでくれるだろうか

@h-east
Copy link
Member

h-east commented Sep 7, 2015

@mattn 皆で「俺のPCでも起きてて困ってたんだけど、このpatchで直ったぜ!Awesome!!」射撃しましょう!

@mattn
Copy link
Member

mattn commented Sep 7, 2015

とりあえず僕がやったこと

  • GdiFlush だめ
  • GetBkMode だめ
  • ReleaseDC(s_hwnd, GetDC(s_hwnd)) だめ
  • InvalidateRect(最終引数TRUE) だめ

しかもこの GetPixel、書き直した位置(X_FILL/Y_FILL)じゃないと直らない。

@yoheie
Copy link
Author

yoheie commented Sep 7, 2015

gui_update_cursor() の最後だと、スクロールと関係ないときにも
カーソルの再描画で毎回実行してしまうと思うので、どこに入れるのが
適切かはちゃんと検討しないとならないと思っていますが、
まだソースコードを追いきれていないです。

ScrollWindowEx() ですが、 gui_mch_delete_lines()・gui_mch_insert_lines() からしか
呼んでいなくて、スクロールのときは実行されていないように思えるのですが…

@ynkdir
Copy link
Member

ynkdir commented Sep 7, 2015

ScrollWindowEx() ですが、 gui_mch_delete_lines()・gui_mch_insert_lines() からしか
呼んでいなくて、スクロールのときは実行されていないように思えるのですが…

スクロールメッセージを受け取ったら直接は画面更新せずに curwin なんかの内部状態を更新してその後 update_screen() あたりから画面更新用のメッセージが生成 (screen_del_lines()のout_char("\n")) されて gui_write() から呼ばれます。私もよくわかってませんが。

@ynkdir
Copy link
Member

ynkdir commented Sep 8, 2015

回避方法ですが 'renderoptions' で directx を指定すると発生しなくなるかもしれません。

@koron
Copy link
Member

koron commented Sep 8, 2015

うちのマウス、タッチマウスでスクロールが良い感じでピーキーなので
Intel のグラフィックでも発生しないのかも (;´∀`)

参加できなくて寂しい

@yoheie
Copy link
Author

yoheie commented Sep 10, 2015

回避方法ですが 'renderoptions' で directx を指定すると発生しなくなるかもしれません。

私の環境ではこの方法でも回避できませんでした。

パッチですが、 @ynkdir さんのご指摘どおり ScrollWindowEx() の直前で行うようにしてみました。
https://gist.github.com/yoheie/9630ef5008870fb6378e
問題無さそうであれば vim_dev にパッチを提出するつもりで、メールの原稿も書いてみました。
添削お願いいたします。

@ynkdir
Copy link
Member

ynkdir commented Sep 10, 2015

私の環境ではこの方法でも回避できませんでした。

いちおう確認したいんですがenc=utf-8とttfフォントも指定しましたか
:set enc=utf-8 guifont=MS_Gothic:h12:cANSI renderoptions=type:directx

@ynkdir
Copy link
Member

ynkdir commented Sep 10, 2015

添削お願いいたします。

よさげに思います。

@yoheie
Copy link
Author

yoheie commented Sep 10, 2015

@ynkdir

いちおう確認したいんですがenc=utf-8とttfフォントも指定しましたか
:set enc=utf-8 guifont=MS_Gothic:h12:cANSI renderoptions=type:directx

gvim.exe -u NONE -N で起動後 enc・guifont・renderoptions 全てをそのとおり
指定したところ回避できました。
どれか1つ指定しないだけでも発生していました。

@h-east
Copy link
Member

h-east commented Sep 10, 2015

@yoheie patch&メール内容問題ないと思います。:+1:
このバグ、仕事先のDELLのdesktop(Windows 7 64bit)、自宅のGateway ノートPC(Windows 10 64bit)でも起きているので、その情報も足しておいても良いかもしれません。

@yoheie
Copy link
Author

yoheie commented Sep 10, 2015

directx が有効だと問題が発生しないようなので、intel_gpu_workaround()の先頭に
チェックを入れておいた方が良いでしょうか。

intel_gpu_workaround(void)
{
#if defined(FEAT_DIRECTX)
    if (IS_ENABLE_DIRECTX())
        return;
#endif
    GetPixel(s_hdc, FILL_X(gui.col), FILL_Y(gui.row));
}

もう1点気になる点として、この問題、16bit Windowsでは発生するのでしょうか。
さすがに私の方では環境を用意できないです…

@yoheie
Copy link
Author

yoheie commented Sep 10, 2015

あ、encとフォントもチェックしないとダメですね。

@yoheie
Copy link
Author

yoheie commented Sep 10, 2015

これでどうでしょう。

intel_gpu_workaround(void)
{
#if defined(FEAT_DIRECTX)
    if (enc_utf8 && IS_ENABLE_DIRECTX())
    {
        TEXTMETRIC tm;

        GetTextMetrics(s_hdc, &tm);
        if (tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR))
            return;
    }
#endif
    GetPixel(s_hdc, FILL_X(gui.col), FILL_Y(gui.row));
}

@ynkdir
Copy link
Member

ynkdir commented Sep 10, 2015

問題があるとかでなければチェックしなくてもいいかなと思いますが。お好きなほうで。

@k-takata
Copy link
Member

GetTextMetrics() と GetPixel() の処理時間がどのくらいか分かりませんが、フォントまで調べる必要は無いのではないかという気がします。

@mattn
Copy link
Member

mattn commented Sep 10, 2015

GetPixel は何かを変更するAPIでもないし、GetTextMetricsの方が明らかに計算量が多いので、encとdirectx だけ避けておけばいいと思います。

@yoheie
Copy link
Author

yoheie commented Sep 11, 2015

全部の条件が揃ったときだけ return したいので、フォントのチェックだけ除くというわけにはいかないかと。
directx 有効の場合のチェックは抜きにして、 gist に上げた当初のパッチで vim_dev に提出します。

@k-takata
Copy link
Member

@ynkdir
Copy link
Member

ynkdir commented Sep 11, 2015

👍

@mattn
Copy link
Member

mattn commented Sep 12, 2015

パッチもすっきりで良いですね。

@yoheie
Copy link
Author

yoheie commented Sep 15, 2015

7.4.869 で取り込まれました。
vim/vim@3b59755
皆さんどうもありがとうございました。
特に @ynkdir さんには、色々と調べていただきとても助かりました。

@h-east
Copy link
Member

h-east commented Sep 15, 2015

@yoheie 👍 お疲れ様でした。

@ynkdir
Copy link
Member

ynkdir commented Sep 16, 2015

🎉

@todashuta
Copy link
Member

㊗️

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