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 8.1でマウスドラッグ時のスクロールが速すぎるので描画更新の設定を変更する #1714

Closed
wants to merge 1 commit into from

Conversation

dep5
Copy link
Contributor

@dep5 dep5 commented Jul 30, 2021

PR の目的

マウスドラッグ時のスクロールスピードが速くなったようなので修正します

カテゴリ

  • 不具合修正

PR の背景

Windows 8.1で、マウスで選択中または選択部分をマウスでドラッグアンドドロップするときに
スクロールが始まる領域までマウスを少しずつ動かしても、高速にスクロールしてしまいます。
数秒で数百行スクロールするので操作できません。
Windows 10では数十行ほどなのでウィンドウサイズが大きければ操作できます。

正式版では一行程度のスクロールができました。

PR のメリット

ウィンドウに表示されてない範囲まで選択する際に、微調整できるようになります。

PR のデメリット (トレードオフとかあれば)

仕様・動作説明

view/CCaret.cppの
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
をコメントアウトすると収まったので、「PRの背景」に書いた条件時に呼び出さないようにします

PR の影響範囲

テスト内容

テスト1

手順

関連 issue, PR

#1601
#1694

参考資料

@dep5
Copy link
Contributor Author

dep5 commented Jul 30, 2021

Windows 10でも多少影響があるようなので、 #1694 でのOSバージョンチェックをやめました。
#1699 で画面の乱れに対応していただいたので、こちらの現象に気付きました。

余談ですが、マウスで選択中にホイールを回すと数行ずつスクロール可能なようです
ドラッグアンドドロップではできませんが・・・。

@AppVeyorBot
Copy link

Build sakura 1.0.3897 completed (commit 4c7e4fd16a by @dep5)

@berryzplus
Copy link
Contributor

すまんです。説明が「意味不明」だと感じました。

マウスドラッグ時のスクロールスピードが速くなったようなので修正します

速くなったから修正する 👈問題ないです。

何故速くなった? 👈書かれてないです。問題ありです。
 カテゴリが「不具合」で #1601 を参照してるので、「#1601 で壊した」の判断がうかがえます。

本当? 👈自分が見た感じ、嘘ですね。

事象は「速くなった」んではないんじゃないですかね。
(途中段階が描画されなくなっただけで、速度は変わってない。)

不具合内容が「描画効率化の名目で、削ってはいけない画面更新まで削ってしまったこと」だとするなら全体の意味が通るし、適切な変更のように見えます。

@berryzplus
Copy link
Contributor

マウスドラッグ時のスクロールスピードを戻す

クソみたいな指摘をしておくと、上記の解釈からしてコミットコメントも意味不明だと思います。

@berryzplus
Copy link
Contributor

マウスドラッグ時のスクロールスピードを戻す

クソみたいな指摘をしておくと、上記の解釈からしてコミットコメントも意味不明だと思います。

何故この指摘が「クソみたい」なのかというと、
この種の指摘(=コミットコメントが誤っている)に対処するには force push せねばならず、
force pushすると既に付いてるレビューコメントが消える不都合が起きる場合があることと、
git初心者ではforce pushの対応が事実上不可能であることを理由に挙げられます。

@dep5
Copy link
Contributor Author

dep5 commented Aug 1, 2021

コミットコメントを変更しました。

コメントアウトしたら正式版の挙動になるということをたまたま見つけたので、
なぜこうなるのか説明できませんでした。
スピードが速くなったということだけ書こうと思いました。

コミットをやり直すと、いただいたコメントと対応がずれてしまうのも気になりますね。
でも、もしマージされるなら履歴がすっきりしていいのかな、と悩むところです。

余談ですが、#1601 は3月の変更なので appveyor にも残っておらず、
ダウンロードできるファイルは1年前のものになってしまいますね。
できれば数か月間隔にでもテスト版をダウンロードできるとうれしいです。

#1694 では、別の修正方法を見つけていただいたので、 ほかの方法があるのでは?と思って
CaretMarginRateというのを変更してみましたがうまくいきませんでした。

@sonarcloud
Copy link

sonarcloud bot commented Aug 1, 2021

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

100.0% 100.0% Coverage
0.0% 0.0% Duplication

@AppVeyorBot
Copy link

Build sakura 1.0.3900 completed (commit e576db2fd2 by @dep5)

@berryzplus
Copy link
Contributor

総括

コメントを変更していただきましたが、あまり変わってない気がしました。

状況

  • 発生事象への対策として修正内容は適切に見えます。
  • 何を修正するのか、PRのタイトル&説明と修正内容が一致していません。

整理すべき課題

  • 描画が遅い(描画が遅いから複数回を一回にまとめると速くなる キャレット位置の文字情報をステータスバーに設定する際の再描画をまとめる #1601
  • 描画に関する処理がもともと大変わかりにくい
  • キャレット移動に関する処理がもともと大変わかりにくい
  • キャレットを2つ以上移動させる場合の処理がもともとおかしい(そのうち説明します)
  • 画面更新を指示する主体(≒クラス)が適切かどうかに疑いがある(’おそらく、不適切です)

このPRについての感想

「スクロールスピードを速くしたのを元に戻す」にこだわりたいみたいですが、
実態は「マウススクロール時に必要な画面更新が行われなくなっていたのを修正」だと思います。

「速くした」だと、なんとなく「いいこと」に見えて「なんで対応するの?」になります。
「必要な何かが漏れていた」だと、明らかに不具合で対応せにゃならん気になります。

どう思います? > @beru さん

@beru
Copy link
Contributor

beru commented Aug 2, 2021

私が行った変更で不具合が生じるようになったという事で心苦しいですが(自分の環境では再現しなかったんです><)

  • どういうメカニズムで問題が生じているのか
  • それがどうして特定のOSでのみ起きるのか(再現性はそれだけか)
  • 追加した対策でどうしてその問題が解消するのか

等を作成して頂いた修正を取り込む前に出来れば知りたいなと思います。まぁ色々な環境で提示して頂いた対策が有効で新たな問題に繋がらないのであれば、良くわからないけど取り込むというのも有りだとは思いますが…。

という事で動作確認を含め、自分の方でもレビューを進めていきたいと思います。すみません少し時間が掛かりそうです。

@beru beru requested review from beru and berryzplus August 2, 2021 13:48
@beru beru added the 🐛bug🦋 ■バグ修正(Something isn't working) label Aug 2, 2021
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
if (!m_pEditView->GetSelectionInfo().IsMouseSelecting() && !m_pEditView->m_bDragMode) {
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この変更で気になる点としては、ここで特定の条件時にのみ処理を呼ぶようにするというのは分かりましたが、この処理に対応する ::SendMessage(hWnd, WM_SETREDRAW, TRUE, 0); の呼び出しを無条件で呼び出すのは、特に問題が無さそうだからそのままという事でしょうかね?

あとステータスバーの描画(の抑制)がマウスドラッグ時のスクロールスピードに影響するというのも不思議な話ですね。従来は描画処理による副作用でスクロールが遅くなっていたという事なんでしょうか?

スクロール速度(スクロール量?)がどのように決まるのかが今頭の中に入っていないのでコードを見てみます。確かタイマーで行っていたような気が…。

@dep5 dep5 changed the title マウスドラッグ時のスクロールスピードを戻す マウスドラッグ時のスクロールが速すぎるので描画更新の設定を元に戻す Aug 4, 2021
@dep5
Copy link
Contributor Author

dep5 commented Aug 4, 2021

テスト方法です。
1 - v2.4.1 released this on May 30, 2020
2 - 1.0.3899 Merge pull request #1715 from berryzplus/feature/remove_eol_auto_detect
3 - 1.0.3900 マウスドラッグ時は画面更新を停止しないように変更

3つのサクラエディタを用意します
それぞれ #1601 の適用前、適用後、 #1714 の適用後を意図しています
2つめは1.0.3897と1.0.3900以外ならなんでもよいです

文書を開きマウスで選択開始します。
マウスボタンを押したまま少しずつ下端(上端)に動かすとスクロールが始まります。
その時点のスピードが速いのではないかと思いました。

スクロール開始時点のスピード
Windows 8.1
1 - 1行ずつスクロール
2 - スクロール開始に気付くと400行スクロールしている
3 - 1行ずつスクロール

Windows 10
1 - 1行ずつスクロール
2 - スクロール開始に気付くと20行スクロールしている
3 - 1行ずつスクロール

1万行あるファイルでテストしました。
50行表示できるウィンドウの広さにして
48行目にマウスカーソルがかかった時点でスクロールが始まるのはどのビルドでも同じようです。

1万行のスクロールにかかる時間
Windows 8.1
1 - 16秒
2 - 3秒
3 - 13秒

Windows 10
1 - 22秒
2 - 7秒
3 - 20秒

開始時のスクロールスピードの速さが気になっていましたが、マウスカーソルをさらに下(上)に移動する
高速スクロール時のスピードも影響があるようですね。

それぞれ違うマシンですが、3つのサクラエディタの比較にはなると思います。

@dep5 dep5 changed the title マウスドラッグ時のスクロールが速すぎるので描画更新の設定を元に戻す マウスドラッグ時のスクロールが速すぎるので描画更新の設定を変更する Aug 4, 2021
@dep5
Copy link
Contributor Author

dep5 commented Aug 4, 2021

berryzplusさん
タイトルを変更しました
Windows 10ではそんなに速くないため迷いましたが、いいことには思えなさそうな速すぎるに変えました。

beru さん
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
はステータスバーの再描画を抑制する目的だと思うのですが(違ったらすいません)、
文字列編集など想定外の描画にも影響が出るのではないでしょうか?
Windows 8.1では再描画を止めてしまうので、描画の自動更新を前提としている機能が影響を受けるのでは?
Windows 10では修正されて、ある程度の描画をするようになり、操作に影響することは少なくなったのでは?
みなさんのようにデバッグもできず、情報のソースも無いですが、想像で書いてみました。

::SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);
に対処しないのは問題が無さそうだからです。
TRUEが既定値なのではないかと思い込んだのと、条件判定を何回もするのも重くなるかなと思いました。

従来のほうがスクロールが遅かった可能性もあるんですね。
#1601 で本来のスピードが出るようになったわけですね。
30行表示しているウィンドウで35行選択できなくて困ってPRを出しましたが
改めてテストしてみるとマウスドラッグ時のスクロールが全体的に速いみたいなので
描画負荷が軽くなってスクロールも速くなったのかもしれないですね。

#1699 で画面の乱れは解決したので、スクロール量を設定できれば、そのほうがいいですね。

Windows 10でのスクロールの速さは操作できないというほどでもないですが
みなさんはこれくらいの速さのほうがいいんでしょうか?
わたしは1行ずつ選べると助かりますが。

お二人とも問題を整理してくださるので大変助かってます、ありがとうございます。

@beru
Copy link
Contributor

beru commented Aug 6, 2021

beru さん
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
はステータスバーの再描画を抑制する目的だと思うのですが(違ったらすいません)、
文字列編集など想定外の描画にも影響が出るのではないでしょうか?
Windows 8.1では再描画を止めてしまうので、描画の自動更新を前提としている機能が影響を受けるのでは?
Windows 10では修正されて、ある程度の描画をするようになり、操作に影響することは少なくなったのでは?
みなさんのようにデバッグもできず、情報のソースも無いですが、想像で書いてみました。

自分はWindows 10でしか確認していませんが、ステータスバーの描画を抑制すると WM_MOUSEMOVE メッセージが呼ばれる回数が増えるようです。今まで詰まってたウィンドウメッセージがスムーズに流れるようになるという事かと思います。で、そうなると CEditView::OnMOUSEMOVE メソッド内で呼び出す CCaret::MoveCursor メソッドで縦スクロールする処理が頻繁に呼び出されるようになります。1回のスクロール量が小さくても積み重なると大きい数値になるので、それでマウスドラッグ操作をした場合の縦スクロールが速すぎる現象が発生しています。

自分の方で強引な対策を入れて動作確認してみました。
beru@f1f0849
あんまり根本的な対策にはなっていませんが…。

::SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);
に対処しないのは問題が無さそうだからです。
TRUEが既定値なのではないかと思い込んだのと、条件判定を何回もするのも重くなるかなと思いました。

最近のプロセッサは高速なので、それぐらいの条件判定では重くはならないですよ。
もし何回も同じ条件判定をするのが気になるなら、面倒ですが一時変数に判定結果を代入して使うと良いです。

従来のほうがスクロールが遅かった可能性もあるんですね。
#1601 で本来のスピードが出るようになったわけですね。
30行表示しているウィンドウで35行選択できなくて困ってPRを出しましたが
改めてテストしてみるとマウスドラッグ時のスクロールが全体的に速いみたいなので
描画負荷が軽くなってスクロールも速くなったのかもしれないですね。

自分もそういう理解です。マウスドラッグの量を少なめにした時に以前より滑らかにスクロールするのが感じれると思います。

#1699 で画面の乱れは解決したので、スクロール量を設定できれば、そのほうがいいですね。

Windows 10でのスクロールの速さは操作できないというほどでもないですが
みなさんはこれくらいの速さのほうがいいんでしょうか?
わたしは1行ずつ選べると助かりますが。

マウスドラッグの量(ウィンドウからはみ出たマウスドラッグの量)に応じてスクロール速度が多少変わりますが、全体的にちょっと速すぎますね。

一定時間以内にたくさんスクロール処理が呼び出されると結構大きい数字になるのが問題のメカニズムだと思います。

対策方法は色々と考えられます。

  • 小数点単位のスクロール量に対応する
    • これはエディタの描画処理や内部で保持するスクロール位置の変数にまつわる計算も更新が必要なので対応するのは厳しそうです。
  • 一定時間以内にスクロール処理が必要以上に呼び出しが多くされないように対策を入れる

お二人とも問題を整理してくださるので大変助かってます、ありがとうございます。

問題提起してくれてありがとうございます。色々と問題が有っても慣れるとそれに気づかなくなったりするので人の意見はありがたいです。

@berryzplus
Copy link
Contributor

エディットビュー上でドラッグを開始する(マウスの左ボタン押しっぱなし)
 👇
エディットビューの領域外にドラッグする(まだ押しっぱなし)
 👇
WindowsによりWM_NCMOUSEMOVEが送出される
※実態はWM_MOUSEMOVEを処理してるかもしれない。
 👇
イベントに応じて「誰か」が「何かの条件」でスクロールを発生させている
※スクロールには量(=何行スクロールさせるか)も必要なので、これも決めてるはず。

「スクロール速度が速すぎる」の対策は普通、スクロール条件とスクロール量を見直すんじゃないかと思います。

スクロール条件によっては、あるイベントに対してスクロール指示が多数発行されてしまったり、
スクロール量がとんでもない値(≒数百行とか)になってしまったりするのを直すってことです。

報告されてる内容からすると、おそらく「スクロール条件が誤っている」んですよね。
あるイベントに対して重複してスクロール指示を発行してしまうロジックになってたらそういうことが起きるので。

「スクロール条件」や「スクロール量の決定」に関しては、
最近だと「加速度」とか「慣性」とかの概念を反映した考え方があって、
「何が正しいか?」を語り出したらぐちゃぐちゃになること間違いなさそうです。

で、今回は条件を直すんでしたっけ?というと違っていて、
スクロール処理自体が遅いことを、回生ブレーキのように利用するやり方です。
※回生ブレーキの特徴は「まれにブレーキが効かないことがある」ってとこです。

berryzplus
berryzplus previously approved these changes Aug 7, 2021
Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

対象環境がwindows8.1ということもあり、判断できないので入れてみたらどうかと思います。

ただ、修正対象コードがキャレットを制御するクラスで、キャレットがエディットビューやステータスビューの描画を抑制したりしなかったりする現在の構成は誤っているような気がします。(なので、このPRで入れる修正はいずれ消さないといけないと思います。)

@beru
Copy link
Contributor

beru commented Aug 7, 2021

ステータスバーの再描画を WM_SETREDRAW で抑える処理があるとスクロールが速すぎる

対策としてその抑える処理を行わないようにする

というのは現象の対処方法としてはまぁ分かるんですが、ステータスバーを表示していない時には問題が無いのかが気になります。

#1714 (comment) でdep5さんがテスト方法を書いてくれたのでこちらでも確認しようと思います。

マウスドラッグの量(エディト領域からはみ出たマウスドラッグの量)に応じてスクロールの速度が変わりますが、そんなにドラッグを大きくしていないのに大きく縦スクロールしてしまう(速すぎる)というのが問題なんだと思います。

ドラッグの量に応じてスクロール量を決める処理内容は特に変えた覚えは無いので、WM_MOUSEMOVE イベントメッセージが頻繁に呼び出されるようになった為に現象が起きているのかなと思います。

WM_MOUSEMOVE イベントメッセージが頻繁に呼ばれること自体は本来はありがたい事(きめ細かくカーソルの座標変化が取れるので)なので、プログラム側でうまく対処してあげるのが望ましいと思います。WM_MOUSEMOVE イベントが呼ばれる頻度によらず、タイマーとかで定期的に現在のドラッグ位置に応じてスクロールする方が良いんでしょうかね?

@dep5
Copy link
Contributor Author

dep5 commented Aug 7, 2021

ほかの方法でスクロールを遅くできないかといろいろ触ってみましたがやっぱりうまくいきませんでした。
beruさんのコードに気付いて試してみましたが、変化はないようでしたが…。

if (abs((Int)nScrollRowNum) < 2)

if (abs(nScrollRowsPerTiming) >= 1) {
nScrollRowNum = 0;
}
と書き換えてみたところ、Windows 10では「スクロール開始時」についてはそれなりのスピードに落ちました。
Windows 8.1でチェックしてみたところ400行のスピードが20行ほどになったので、もう少し数値を調整したいところです。

nScrollRowNumが小さい時の挙動を何段階か設定すれば、
高速スクロール時のスピードを維持したまま、低速時も微調整が効くようになるかもしれないですね。

beruさんは元のコードでもスクロールスピードが落とせたのですか?
PCの構成で設定を変えないといけないなら困りますね…

#1694 (comment) でも書きましたが、改めて調べると今回のPRの内容でも
ステータスバーを表示しているときだけこの現象が起きるようです。
逆に言うと、ステータスバーを表示していない時には
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
は呼ばれないということですかね?(メリットもデメリットも含めて以前通り)

::SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);
の条件判定は今回さわれませんでした…

多すぎる WM_MOUSEMOVE イベントをどうにかする方向でどなたか対処していただけるとうれしいです。

@dep5
Copy link
Contributor Author

dep5 commented Aug 7, 2021

berryzplusさん
approvedありがとうございます。

ほかの方法がありそうなので、もう少し待ってみたいと思います。

@beru
Copy link
Contributor

beru commented Aug 7, 2021

@dep5 さん

一定時間以内にスクロール処理が必要以上に呼び出しが多くされないように対策を入れる処理例として下記のような対策はどうでしょうか?

beru@ca74f1d#diff-5388f4e469fbee9a3d53bbd2600d62a1e37badcd9e2f74ab002baf64478a62b6

@beru
Copy link
Contributor

beru commented Aug 7, 2021

beruさんは元のコードでもスクロールスピードが落とせたのですか?
PCの構成で設定を変えないといけないなら困りますね…

ある程度は落とせましたがそれが理想の挙動かというと全然そんな事も無いです。
ちなみにあのコードではドラッグ量がそんなに大きくない場合に一定時間以内にスクロールする行数を制限しています。履歴取ったりして色々やってますが、効果はいまいちですね。

色々な環境では試していないですが、多分対策としてはあまり良くないと思います。
#1714 (comment) で紹介した対策の方が良いかもしれません。

#1694 (comment) でも書きましたが、改めて調べると今回のPRの内容でも
ステータスバーを表示しているときだけこの現象が起きるようです。
逆に言うと、ステータスバーを表示していない時には
::SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
は呼ばれないということですかね?(メリットもデメリットも含めて以前通り)

CCaret::ShowCaretPosInfo メソッドって行数が長すぎて処理内容が把握しにくいと思いますが、dep5さんが変更した箇所の少し周りのコードも含めて何をやっているのか読んでみれば分かる事です。ステータスバーに関する処理なので、ステータスバーを表示していない時には当然呼ばれません。

@berryzplus berryzplus dismissed their stale review August 8, 2021 08:53

別案を検討しよう、という流れになったので。

@dep5
Copy link
Contributor Author

dep5 commented Aug 11, 2021

beruさんの新しいコードをテストしてみました。
CCaret.cpp
beru@f1f0849

if (abs(nScrollRowsPerTiming) >= 8) {

if (abs(nScrollRowsPerTiming) >= 1) {
nScrollRowNum = 0;
}else
if (abs(nScrollRowsPerTiming) >= 8) {
に置き換えています

CEditView_Mouse.cpp
beru@ca74f1d#diff-5388f4e469fbee9a3d53bbd2600d62a1e37badcd9e2f74ab002baf64478a62b6

Windows 10
CCaret.cpp
十分にスピードが落ちた
ブラウザーのようなスムーズな動き

CEditView_Mouse.cpp
十分にスピードが落ちた
下方向のスクロール時に止まってしまうことがある
いったん止まるとマウスを動かすまでスクロールは止まったまま
メモ帳の動きに似ている
ステータスバーを表示しない時と似ている

Windows 8.1
CCaret.cpp
スムーズ
現状のWindows 10程度のスピードに落ちた。
ステータスバーを表示しない時に比べると速いが操作できなくはない

CEditView_Mouse.cpp
十分にスピードが落ちた
下方向のスクロール時に止まってしまうことがある
ボタンを押したまましばらく待つと超低速のスクロールが始まる。
ステータスバーを表示しない時と似ている

ステータスバーの表示の有無でスクロール方法をあまり変えたくないなら
CEditView_Mouse.cpp
(Windows 8.1ではちょっと速いが)スムーズさをとるなら
CCaret.cpp
かな、と思いました。

わたしはCCaret.cppの動きのほうが好みです。
低速時と高速時のバランスなど調整が済んで問題が無ければ
いずれこのスクロール方法をデフォルトにしてほしいなと思いました。

beru added a commit to beru/sakura that referenced this pull request Aug 14, 2021
@beru
Copy link
Contributor

beru commented Aug 14, 2021

beruさんの新しいコードをテストしてみました。

@dep5 さん、テストありがとうございます。遅い返事でごめんなさい。

CCaret.cpp
beru@f1f0849

if (abs(nScrollRowsPerTiming) >= 8) {

if (abs(nScrollRowsPerTiming) >= 1) {
nScrollRowNum = 0;
}else
if (abs(nScrollRowsPerTiming) >= 8) {
に置き換えています

自分の方でこの変更を確認してみました。ちなみに下記のようなコードにしました。

			if (abs(nScrollRowsPerTiming) >= 1) {
				nScrollRowNum = 0;
			}else
			if (abs(nScrollRowsPerTiming) >= 8) {
				nScrollRowNum = std::min(nScrollRowNum, (CLayoutInt)+1);
				nScrollRowNum = std::max(nScrollRowNum, (CLayoutInt)-1);
			}

上記のコードにするとドラッグ量が小さい場合はほぼスクロールがされないので、きちんと操作が出来ないです。おそらくdep5さんの方では違う内容の変更をしたのかもしれないですね。

なおマークダウンではコードの前後を3連続 backquote ` 文字で囲む事で見やすく表示してくれます。githubのコメント入力欄のツールバーにも <> というアイコンがあります(ショートカットは ctrl + e)。dep5さんも是非この機能を活用してください。

あとコメント中でコードだと結局断片的で分かりにくいのでテスト用のブランチを作ってコミットしてそのブランチを push した方が、手間ですが変更内容を伝えやすいと思います。例えば下記のようにです。

beru@255b4ea#diff-e14767802a1b71dcc35a08214814bac0acdce9b11dbbd41e333e64c6858a7990

CEditView_Mouse.cpp
beru@ca74f1d#diff-5388f4e469fbee9a3d53bbd2600d62a1e37badcd9e2f74ab002baf64478a62b6

Windows 10
CCaret.cpp
十分にスピードが落ちた
ブラウザーのようなスムーズな動き

CEditView_Mouse.cpp
十分にスピードが落ちた
下方向のスクロール時に止まってしまうことがある
いったん止まるとマウスを動かすまでスクロールは止まったまま
メモ帳の動きに似ている
ステータスバーを表示しない時と似ている

Windows 8.1
CCaret.cpp
スムーズ
現状のWindows 10程度のスピードに落ちた。
ステータスバーを表示しない時に比べると速いが操作できなくはない

CEditView_Mouse.cpp
十分にスピードが落ちた
下方向のスクロール時に止まってしまうことがある
ボタンを押したまましばらく待つと超低速のスクロールが始まる。
ステータスバーを表示しない時と似ている

動作確認ありがとうございました。CEditView_Mouse.cpp を変更する方法( link )だと確かにdep5さんが記載してくれる問題が起きますね。下方向のスクロール時に止まってしまうのは理由が分かってないです。。

ステータスバーの表示の有無でスクロール方法をあまり変えたくないなら
CEditView_Mouse.cpp
(Windows 8.1ではちょっと速いが)スムーズさをとるなら
CCaret.cpp
かな、と思いました。

わたしはCCaret.cppの動きのほうが好みです。
低速時と高速時のバランスなど調整が済んで問題が無ければ
いずれこのスクロール方法をデフォルトにしてほしいなと思いました。

CCaret.cpp の方法はバランス調整が必要そうですね。

あとそもそも CEditView::OnMOUSEMOVE メソッドが1秒間に何回呼び出しがされようが(これは環境によって変わるはず)ちょうど良い具合のスクロールが行われるようにするのが望ましいと思うので、何か対策を考えてみます。あとマウスの座標の移動量はピクセル数単位ですがDPIの考慮が必要かもしれません。

@dep5
Copy link
Contributor Author

dep5 commented Aug 25, 2021

Windows 10でテストしました。
選択状態でマウスボタンを押したまま下端から2行目にマウスカーソルを置いて
5秒程度でボタンを離します。(masterに当該コミットだけを反映させてテストしています)
290行スクロール - master
290行スクロール - f1f0849

50行スクロール - 255b4ea

この変更でこちらではちょうどよいスピードになりました。
何台かのPCでチェックはしているのですが、beruさんと何かスペックが違うのでしょうね。

255b4ea から

		else if (abs(nScrollRowsPerTiming) >= 8) {
			nScrollRowNum = std::min(nScrollRowNum, (CLayoutInt)+1);
			nScrollRowNum = std::max(nScrollRowNum, (CLayoutInt)-1);
		}

この部分を削除してもちょうどよいスピードのままでしたので
わたしの環境ではこの部分はスクロールの減速には影響がないようです。

			if (abs(nScrollRowsPerTiming) >= 1) {
				nScrollRowNum = 0;
			}

逆にberuさんはこれの追加でスクロールが遅くなったのですね。

二つともうまくいかせる表現があるといいんですが「1以上」のほうが優先されちゃいそうですね・・・

何が影響しているんでしょうね

<>を使うと見やすくなりますね。ありがとうございます

@berryzplus
Copy link
Contributor

何台かのPCでチェックはしているのですが、beruさんと何かスペックが違うのでしょうね。

画面解像度が違う、という結論になってる気がします。
HighDPI対応っす。

MouseMoveで認識できる移動量はpx単位ですが、
画面解像度が異なると同じ移動量が表す意味が異なってきます。

1280x768な画面の場合、1行あたりのピクセル数は・・・
1920x1080な画面の場合、1行あたりのピクセル数は・・・
3840x2160な画面の場合、1行あたりのピクセル数は・・・

元々のコードは96DPI換算の移動量になってるので、
その辺の数字をHighDPI対応にしてやる必要があるんだと思います。

@beru
Copy link
Contributor

beru commented Aug 29, 2021

@dep5 さん

動作確認してくださっているのはとてもありがたいのですが、コメント( #1714 (comment) )にdep5さんが変更したコードが断片的に紹介されているので、他の人がその断片的なコードをコピーして手動でマージすると、dep5さんが確認したソースコードと内容が食い違う可能性が出てきます。

手間だとは思いますがdep5さんの方でブランチを作成してそれをgithubにpushしてそのURLを伝えていただくのが良いかなと思います。

@berryzplus
Copy link
Contributor

これ、なんでしたっけ?

・・・。

#1714 (comment) で「別案を検討しよう、という流れになった」とあるので閉じておきます。

@berryzplus berryzplus closed this Sep 25, 2021
@dep5
Copy link
Contributor Author

dep5 commented Jan 4, 2022

beruさん
255b4ea
だと変更部分しか表示されないので上下に展開したリンクです。

https://github.com/dep5/sakura/compare/fixscrollspeedwin81

@beru
Copy link
Contributor

beru commented Jan 4, 2022

@dep5 さん、リンクありがとうございます。動作確認してみます。

@dep5 dep5 changed the title マウスドラッグ時のスクロールが速すぎるので描画更新の設定を変更する Windows 8.1でマウスドラッグ時のスクロールが速すぎるので描画更新の設定を変更する Jan 4, 2022
@berryzplus
Copy link
Contributor

この件って結局、「Windows 8.1で~」なんですかね?

当初気付いてなかったんですが、
現在のサクラエディタの対応OSは「Windows 10以降」らしいです。

「Windows 8.1で~」という問題なのであれば、
まず「サクラエディタを Windows 8.1 でも使えるようにする」
が必要な気がします。

@dep5
Copy link
Contributor Author

dep5 commented Jun 11, 2022

beruさん
コメントをいただいた当時、スクロールの挙動がわたしと違うのはPCのスペックとかが原因なのかな、
不具合が起こる人がいるならPRを進めるのはあきらめようと思い、これまで個人的に使ってきました。
最近わたしもスクロールが止まってしまって困ったのでようやく気付いたのですが、
https://sakura-editor.github.io/help/HLP000007.html
普段使っている「行番号エリアのドラッグ」でしかテストしていなかったことに気付きました。
「矩形の範囲選択」でも大丈夫なようでしたが、通常の「範囲選択」でスクロールがストップしてしまいますね。
新しいPRにすることにしました。

@dep5
Copy link
Contributor Author

dep5 commented Jun 11, 2022

berryzplusさん
サクラエディタ 2.4.0.0で対応OSが変更されていたんですね。知りませんでした。
対応OSから外れると起動すらできないソフトもある中、
ここではこのPRも含めWindows 8.1への対応をしていただきありがたかったです。
サポート期限もあと少しなので、操作に支障がなければ気にしないようにはしていたのですが、
Windows 8.1ユーザーで困っている人にヒントにしてもらえればと思って、PRタイトルを変更しました。
わたしもOS変更のことを考えないといけませんので、メインをWindows 10として新しいPRにすることにしました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛bug🦋 ■バグ修正(Something isn't working)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants