TransWikia.com

WindowTabsの移動時退避Windowの位置不具合を修正したい

スタック・オーバーフロー Asked by s.yamamoto on October 11, 2020

こんにちは。
以前、WindowTabsのビルドをしていただきました。

WindowTabs というオープンソースを改良してみたいのですがビルドができません。何か必要なものがありますか?

その時は、大変ありがとうございます。非常に助かりました。
おかげで、デフォルト値の変更ができたり、安心してWindowTabsを使い続けることができます。

詳細はこちらにもまとめとして記載させていただきました。

全Windowタブ化。Setsで頓挫した夢の操作性をオープンソースのWindowTabsで再現する。 – Qiita


今回はWindowsTabの追加の改良、不具合修正についての質問です。

WindowTabsでは、既存の不具合なのですが、マルチモニター上でしか発生しない問題があります。

「1」
 「2」
このようにモニターを並べて動かしています。

このときに、WindowTabsでタブ化されたWindowを動かすときに、裏側にあるWindowが「1」のモニターのRightとBottomに、そのWindowの左上になるように退避されているのが見えてしまいます。

モニターの配置を
「1」「2」
のように完全に横並びや
「1」
「2」
のように完全に縦並びにしておけば顕在化しない不具合なのですが、斜め右に配置されると隠しウィンドウの位置が見えてしまうというものです。
先頭モニタの大きさ分、背景Windowが一時退避されている動きがバレバレになってしまっています。

これを、先頭モニターのRect分ではなく、全モニター分、ワークスペースというのでしょうか
その分、どこかに移動させておきたいと思っています。

WindowTabsWtProgramDesktop.fs

member x.dragBegin() = invoker.asyncInvoke <| fun() ->
member x.dragDrop((pt, data)) = invoker.asyncInvoke <| fun() ->

このあたりの処理か、や、

WindowTabsWtProgramSharedDrawing.fs

member private this.info = Win32Helper.GetMonitorInfo(hMonitor)

このあたりの処理をみてみたのですが

F#という言語の難しさもあり、rectでオフセットをとっているようにも見え、top や left の値を細かく代入して何かをすることはできていません。

上記の不具合の直し方、また、実際の処理はここにある、ということなどがわかる方おられましたら、よろしくお願いします。

WindowTabsは、Forkも非常に多い様子ですので、どこかの誰かは直しているのかもしれませんが、多すぎてどこを参考にすればいいかもわかりませんでした。
それらの情報もお持ちの方おられましたら、教えていただけますと助かります。


追記
次の場所で処理が行われていることがわかりました。
ここで、corner という値が先頭モニターの右下になっているようなのですが、
これを、WorkRectの右下になってくれたらよいのですが
どのように修正すればいいのかがわかりませんでした。

既存コードでは、WorkRect内のモニターRectに対するコーナー(角)の中で、右下をもってこようとっしている様子ですが、ここに何か不具合の原因があるような気がします。

わかる方おられましたらよろしくお願いします。

WindowTabsstandard-softwareWindowTabsWtProgramSharedWin32.fs

    member this.hideOffScreen (size:Sz option) =
        let corners = Mon.all.map <| fun monitor -> monitor.workRect.BR.sub(monitor.workRect.location)
        let corner = corners.fold (Pt()) <| fun maxCorner corner ->
            if maxCorner.x < corner.x then maxCorner else corner
        let corner = corners.fold corner <| fun maxCorner corner ->
            if  maxCorner.x = corner.x && 
                maxCorner.y < corner.y then
                maxCorner
            else
                corner

        let corner = Pt(corner.x-1, corner.y-1)
        this.setPlacement({
            this.placement with
            showCmd = ShowWindowCommands.SW_SHOWNOACTIVATE
            rcNormalPosition = Rect(
                corner,
                if size.IsSome then size.Value else this.placement.rcNormalPosition.size
            )
        }) 

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP