From 4330c95216d79c9b466987b331d1be261712ba1c Mon Sep 17 00:00:00 2001 From: Kang Yu Date: Mon, 17 Mar 2025 20:53:17 -0700 Subject: [PATCH] refactor TryInheritWindow(), making it safe to be called for both new and captured window --- .../Common/PersistentWindowProcessor.cs | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/Ninjacrab.PersistentWindows.Solution/Common/PersistentWindowProcessor.cs b/Ninjacrab.PersistentWindows.Solution/Common/PersistentWindowProcessor.cs index 797409c..223aa03 100644 --- a/Ninjacrab.PersistentWindows.Solution/Common/PersistentWindowProcessor.cs +++ b/Ninjacrab.PersistentWindows.Solution/Common/PersistentWindowProcessor.cs @@ -1396,7 +1396,17 @@ namespace PersistentWindows.Common if (!monitorApplications.ContainsKey(display_key)) monitorApplications[display_key] = new Dictionary>(); + List app_list = null; + if (monitorApplications[display_key].ContainsKey(hwnd)) + { + app_list = monitorApplications[display_key][hwnd]; + monitorApplications[display_key].Remove(hwnd); + } monitorApplications[display_key][hwnd] = deadApps[display_key][kid]; + if (app_list != null) + { + monitorApplications[display_key][hwnd].AddRange(app_list); + } deadApps[display_key].Remove(kid); //replace prev zorder reference of dead_hwnd with hwnd in monitorApplication @@ -3041,6 +3051,33 @@ namespace PersistentWindows.Common return true; } + private bool TryInheritWindow(IntPtr hwnd, IntPtr realHwnd, IntPtr kid, ApplicationDisplayMetrics curDisplayMetrics) + { + if (kid == IntPtr.Zero) + { + ResolveWindowHandleCollision(hwnd); + } + else + { + var prevDisplayMetrics = InheritKilledWindow(hwnd, realHwnd, kid); + if (hwnd != kid) + { + if (prevDisplayMetrics.Title != curDisplayMetrics.Title) + Log.Error($"Inherit position data from killed window {prevDisplayMetrics.Title} with different title {curDisplayMetrics.Title}"); + else + Log.Error($"Inherit position data from killed window {prevDisplayMetrics.Title}"); + ResolveWindowHandleCollision(hwnd); + } + else + Log.Error($"Inherit position data from existing window 0x{kid.ToString("X")} for {curDisplayMetrics.Title}"); + + if (initialized && autoRestoreNewWindowToLastCapture) + return true; + } + + return false; + + } private bool IsWindowMoved(string displayKey, IntPtr hwnd, User32Events eventType, DateTime time, out ApplicationDisplayMetrics curDisplayMetrics, out ApplicationDisplayMetrics prevDisplayMetrics) { @@ -3137,28 +3174,7 @@ namespace PersistentWindows.Common return false; IntPtr kid = FindMatchingKilledWindow(hwnd); - bool restore_last = false; - if (kid == IntPtr.Zero) - { - ResolveWindowHandleCollision(hwnd); - } - else - { - prevDisplayMetrics = InheritKilledWindow(hwnd, realHwnd, kid); - if (hwnd != kid) - { - if (prevDisplayMetrics.Title != curDisplayMetrics.Title) - Log.Error($"Inherit position data from killed window {prevDisplayMetrics.Title} with different title {curDisplayMetrics.Title}"); - else - Log.Error($"Inherit position data from killed window {prevDisplayMetrics.Title}"); - ResolveWindowHandleCollision(hwnd); - } - else - Log.Error($"Inherit position data from existing window 0x{kid.ToString("X")} for {curDisplayMetrics.Title}"); - - if (initialized && autoRestoreNewWindowToLastCapture) - restore_last = true; - } + bool restore_last = TryInheritWindow(hwnd, realHwnd, kid, curDisplayMetrics); //newly created window or new display setting curDisplayMetrics.WindowId = (uint)realHwnd;