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

[WIP] Windows 7 の Aero Snap に対応させる修正 #120

Conversation

berryzplus
Copy link
Contributor

@berryzplus berryzplus commented Jun 15, 2018

目的

windows7 の AeroSnapに対応させる。

課題内容

タブを表示中のサクラエディタをエアロスナップさせた状態で、
別のタブに切り替えるとエアロスナップが解除されてしまう。
これまでの経緯については関連issueを参照。

関連issue:
#45, #65, #107

タスク

  • ウインドウのスナップ状態をチェックする方法の確立
  • ウインドウをスナップ状態に遷移させる方法の確立
  • ウインドウのスナップ状態に複数種類がないかの確認
  • ウインドウをスナップ状態に遷移させるべき処理の確認

対応方法

sourceforge.netに上がっていたパッチを取り込み、
修正を加えることで対応を完了させる。

取込元パッチの情報
https://sourceforge.net/p/sakura-editor/patchunicode/1009/
SetAeroSnap_v219_r4011.patch

取込手順
#47

※そのまま取り込むことに賛同できなかった理由
 ウインドウ拡張メモリが無駄遣いされているように感じ、精査が必要と判断したため。
  ↓
 結局、ウインドウ拡張メモリは使わずに済ませることができた。

メモ
パッチを取り込むことによりスキップできたタスクは以下の通り。

  • スナップ状態をチェックする方法の確立
     GetWindowRect と GetWindowPlacement の戻り値を比較して差異があればスナップ状態
  • スナップ状態に遷移させる方法の確立( 1/2 )
     Winキー+方向キーの入力イベントを送出すれば遷移が可能
  • スナップ状態に遷移させるべき処理の確認
     タブ切替、新規作成

エアロスナップ

ウインドウをエアロスナップ状態に遷移させるための専用APIは存在しない。
調査にあたっては Designing Aero Snap などの設計資料も参照した。
どうしたらエアロスナップ状態に遷移できるか?の観点で調査。

エアロスナップに遷移させる方法は5つ。

  1. Winキーと方向キー「→」を押下する
  2. Winキーと方向キー「←」を押下する
  3. ウインドウ(タイトルバー)の上端をダブルクリックする
  4. ウインドウの下端をダブルクリックする
  5. ウインドウ(タイトルバー)の上端をドラッグしてスクリーン上端にドロップする

※ Winキーと方向キー「↑」を押下すると最大化されるが、これはエアロスナップではない。
※ Winキーと方向キー「↓」を押下すると最小化されるが、これはエアロスナップではない。
※ キー操作による遷移は方向によって異なるが、マウス操作の結果はすべて同じ。
※ プログラム的にはキー操作とマウス操作の 2 パターンとみることができる。

メモ
調査により完了できたタスクは以下の通り。

  • スナップ状態に遷移させる方法の確立( 2/2 )
     「タイトルバーの上端をダブルクリック」の入力イベントを送出すれば遷移が可能

修正内容

タブ切替時の位置合わせに使用している CTabWnd::SetCarmWindowPlacement を拡張し、切替元の CEditWnd の表示状態に合わせて AeroSnap 状態を引き継ぐ(=設定する)ように変更する。

検証方法

上記「エアロスナップ」を参考にサクラエディタを Aero Snap 状態にする。
問題が起きていたのは、Aero Snap 状態から、新規作成(Ctrl+N) or タブ切替(Ctrl + Tab)した場合の挙動。
実際に何が起きるか挙動を検証する。

  • 変更前は、エアロスナップが解除される。
  • 変更後は、エアロスナップが一度解除された後、元のエアロスナップ状態に戻る。

お願い

動作について不明点があれば、コメントでお知らせください。
コードについての不明点にもできる限りでお答えしますので、お気軽にどうぞ。

プログラム起動時の同期不具合の対処ができるまで凍結中です。
準備ができたら WIP 外します。もうしばらくお待ちください・・・・。

ryoji and others added 2 commits June 15, 2018 19:59
https://sourceforge.net/p/sakura-editor/patchunicode/1009/
SetAeroSnap_v219_r4011.patch

強引にSendInputを使ってSnap状態を引き継ぐようにしてみたパッチを添付します。
rev4011用のパッチですが、最近のrevでもそのまま使えると思います。

Tab切り替え時に画面がちらつくのが難点です。
(ちらつきを抑える方法はいろいろ試してみましたが、うまい方法は見つかっていません)
ちらついてでもSnapが引き継げることのほうが自分には重要なので、自分専用にはずっとこれを使っています。
強引な方法なのでオプション対応にしておいたほうが無難かもしれません。

下記のように様々なパターンでSnapを引き継げるようにしたつもりですが、
漏れていてうまくいかないようなパターンがあったら教えて下さい。
・Tab切り替え
・[ファイル]-[新規作成]でのTab追加
・[ファイル]-[開く]でのTab追加
・エクスプローラからのファイルダブルクリックによるTab追加
・エクスプローラからのファイルドロップによるTab追加
・タスクトレイからのWindow選択
・別Tab GroupからのWindow選択
・画面右上の☓(閉じる)ボタンで一気に閉じていく最中のTab切り替え
・Snap状態から最小化し、タスクトレイから別TabをActiveにした場合のTab切り替え
・Snap状態から最小化し、エクスプローラでファイルダブルクリックした場合のTab追加

動作確認は64bit Windows(Win7, 8, 8.1, 10)、32bit Win7あたりの環境でやっています。
@kobake
Copy link
Member

kobake commented Jun 16, 2018

大した問題ではないのですが一応突っ込んでおくと、ブランチ名が hotfix/stay_in_aero_snap_mode になっているのが気になりました。これって hotfix として扱う想定ですか?

@berryzplus
Copy link
Contributor Author

これって hotfix として扱う想定ですか?

新規機能じゃないので feature じゃないな、と思いました。
リリース済み機能に対する修正は hotfix で切るものなのかなと思っていました。
明確な意図があって付けてるものじゃないです。すみません。
 参考にしたもの → git-flowで用いるブランチまとめ

マージ先は master を想定していて、
git-flow とか githubflowを使いましょう、と提案するつもりも今のところないです。

困るんでしたっけ?

@kobake
Copy link
Member

kobake commented Jun 16, 2018

たぶん hotfix という言葉の意味を誤解されているように思いました。

現在配布されている最新版は v2.3.2.0 です。
仮に次リリース予定のバージョンを v2.4.0.0 と仮決めするとします。
で、たとえば v2.4.0.0 のリリース予定時期が8月であるとします。

  • v2.3.2.0 に存在するバグ修正を v2.4.0.0 に含めるのであれば、それは単なる fix (bugfix) です。
  • v2.3.2.0 に存在するバグがものすごく致命的で早急に対応したい!8月の v2.4.0.0 まで待ってらんない!来週にでも修正版の v2.3.2.1 出すぞ!って場合に対応するバグ修正のことを hotfix って言います。

どうでしょう?認識合ってますか?

@berryzplus
Copy link
Contributor Author

すみません、基本的には「困る」ということが認識できました。

どうでしょう?認識合ってますか?

これだけのためにリリースを行う意図はありませんでした。

先に書いた通り、新規開発ではない + リリース済み機能の修正で hotfix としました。
hotfix の hot が持つ意味については、なんとなく認識していてちょっと違うな~とは思っていました。

ただ、次バージョンに含めるために作っているか、
現バージョンを修正するために作っているかと考えると後者です。

hot(致命的、緊急対処が必要)ではないと認識しているのも事実なんですが、
たとえば「次リリースは8月です」になるならその前に出したい感じです。
致命的でないと思ってるのに、緊急対処が必要と考えてそうです。

このあたりについては別途相談させてください。

@kobake
Copy link
Member

kobake commented Jun 16, 2018

すみません、基本的には「困る」ということが認識できました。

困ってないです。意図を確認したかったのです。
hotfix でないものを hotfix と称することが続くのであれば「困ります」が。

ただ、次バージョンに含めるために作っているか、
現バージョンを修正するために作っているかと考えると後者です。

意識合わせをしておきたいのですが、少なくとも今の master ブランチに入る内容は全て「次バージョン」を見据えたものです。そうでないバージョンへのコミットを考える場合には別のブランチにマージするような PR を投げることになります。

たとえば「次リリースは8月です」になるならその前に出したい感じです。

これはたとえ話なので全ての数字は仮のものです。

致命的でないと思ってるのに、緊急対処が必要と考えてそうです。

「僕が」「考えてそう」という意味ですか?
これが hotfix であるというならば僕を含め他メンバーも緊急対処が必要なものと認識しますし、そうでないならばその逆です。hotfix という言葉はそういう意味なんです。

対応内容関係なく、「hotfix」と宣言されているのであれば「緊急である理由があるのだろう」と思慮を巡らせます。これは一般的な慣習です。

まとめ

僕から確認したいのは「この PR は本当に hotfix ですか?」の一点だけで、それ以外についての言及は今のところ無いです。

「hotfix ではありませんでした」であれば「そうですかわかりました」となりますし、
「hotfix です」であれば何らかの対応方針(臨時バージョン番号の策定、臨時リリース時期の策定、対応ブランチの運用方法の策定、等々)を検討していく必要があります。

おまけ:考察のヒント

この質疑、本来は一言二言で終わる話なのですが、なんだか混乱されているようなので回答のヒントを書き残しておきます。

客観的に見るとこれは hotfix にするものではないです。
言葉の定義を合わせましょう。

@berryzplus
Copy link
Contributor Author

僕から確認したいのは「この PR は本当に hotfix ですか?」の一点だけで

いいえ、です。

@kobake
Copy link
Member

kobake commented Jun 16, 2018

僕から確認したいのは「この PR は本当に hotfix ですか?」の一点だけで

いいえ、です。

おけです。そこのコンセンサスがとれていれば良いです。
ブランチ名変更はめんどいのでこのままで進めちゃいましょう。

AeroSnap対応によりSTabGroupInfo構造体にメンバrcTopが追加された。
追加したrcTopは本メソッド内でセットしているが、従来から取得できる変数をセットしているので追加の意味がない。
従来方式では取得できない情報を追加したかったと推定されるのでバグとして修正する。

変更対象はCEditWndが作成時にタブグループ情報を取得するために使用しているメソッド。
影響箇所はAeroSnap対応のための追加コード内のみ。
スナップ状態への遷移が必要な場合のみ、AeroSnap操作を行うように変更。
Aero Snap状態に遷移させるための操作は、ユーザのキー入力をプログラム的に生成して行っている。
このため、Aero Snap操作中にユーザがctrlキーを押しっぱなしにしていた場合、強制的にキー押下状態が解除されてしまう。
この事象にはタブ切替のデフォルト割り付けが「Ctrl + Tab」であったために気付いた。
対策として、ctrl,shift,altの押下状態を操作前に記録し、操作後は元に戻すように修正した。
@berryzplus berryzplus changed the title [WIP] Hotfix/stay in aero snap mode Windows 7 の Aero Snap に対応させる修正 Jun 18, 2018
@berryzplus berryzplus changed the title Windows 7 の Aero Snap に対応させる修正 [WIP] Windows 7 の Aero Snap に対応させる修正 Jun 19, 2018
@berryzplus
Copy link
Contributor Author

win10 で見たら怪しげな動きをしている(低確率でaerosnap解除される)のでWIPに戻します。

あと「 win + 方向キー 」のあと、方向キーを離す、winキーを離すの順に操作すると、
aero snap してない方のエリアにウインドウ一覧が表示されるので Ctrl + Tab がwindowsに食われる・・・

@berryzplus
Copy link
Contributor Author

win 10 の妙な動きの原因が判明。

  • win 10 の「田+矢印キー」の仕様が従来と異なっていた。
  • aero snap対応というよりも、タブバー表示時のウインドウ挙動がおかしい。(バグではないが)

このコミット自体の問題ではなさそう・・・。

タブをたくさん開いていくとだんだんおかしな動きをし始めるので、
複数タブを開いたときの制御に何らかの問題があるのではと考えています。
Debug版では、だいたい80タブぐらいからおかしな動きをし始めます。
この問題に対処しない限り aero snap 対応は出せないな、というのが所感です。

@berryzplus berryzplus self-assigned this Jul 8, 2018
@berryzplus
Copy link
Contributor Author

取り込みを断念します。

@berryzplus berryzplus closed this Jul 10, 2018
@berryzplus berryzplus deleted the hotfix/stay_in_aero_snap_mode branch July 10, 2018 13:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants