ことなかれというなかれ購入。…タイトルなげぇ。ごきげんよう。
…一時期こんな感じでWinMergeについて考えてたわけですが。
WinMergeのフォルダー比較がツリー表示になるときとならないときがある。2つのフォルダーをCtrl+クリックで1つずつ選択してドラッグアンドドロップするとツリー表示になるが、マウスで範囲選択またはShift+クリックでフォルダーを2つ選択したときはサブフォルダーが展開されない
— ond (@ondamayadori) 2017年4月10日
いやわかった、Ctrl+クリックでフォルダーを2つ選択してD&Dすると最初はツリー表示だけど、もう一回D&Dすると今度は展開されなくなる。昨日書いたあとやっぱりなんか違うと感じてたのがやっと解けた。D&Dとかパスのリストが渡るだけだと思ってたけど何か別の情報もあるのか動作が変わる
— ond (@ondamayadori) 2017年4月11日
気になりすぎてソースコード見てみたら GetAsyncKeyState(VK_CONTROL) の値を再帰フラグにしてた。Ctrl押しながらドロップ、を想定してるんだろうけどドラッグ前に押した場合でも1が返るからこれを誤判定してる。他の場所は0x8000で&してるからバグで確定か
— ond (@ondamayadori) 2017年4月18日
こんな気になってしかたなくなるなんてもう恋なんちゃうんかと。
ちがっ…! あ、アイツとはただの仕事上の付き合いなんだから!
その後さらに調べたことがあるんですが貼る機会なかったので
供養しときます。
WinMerge日本語版も見てみたら「サブフォルダを含む」にチェック入ってたら常にrecurseするように変更されてた。ただGetAsyncKeyStateのバグ自体は修正されてなくて、チェックなくてもドラッグ前にCtrl押したらツリー表示されてしまう…って実害あるかわからんけど
あと解析中に知った裏機能で、フォルダーを1つだけShift押しながらドロップすると自分自身と比較という謎なことができる。こっちはドラッグ前にShift押しても無効(正常)。Ctrl+Shift押しながらドロップ、もしくは事前にCtrl押してShift押しながらドロップでツリー表示
キーの判定に違いがあるのは GetAsyncKeyState(VK_CONTROL) の後に GetAsyncKeyState(VK_SHIFT) が呼ばれる実装のため。事前にShift押してても最初の呼び出しで情報がクリアされて2回目の判定は常に偽。押しっぱなしなら0x8000
そうすると今度はGetAsyncKeyState関数のほうに興味出てくるというか、「前回の関数呼び出し以降にキーが押されたら最下位ビットが1」という仕様は誰得なのかと。複数のキーを判定する実装とか考えたらガバガバなの目に見えてるのに。いやGetKeyboardStateを使うのか
…やっぱり恋(ry
0 件のコメント: