v1.9.14: fix dialog minimize bug — restore modal dialogs on un-minimize

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-03-05 03:25:18 -05:00
parent 3bafb0deb8
commit f9a81a4825
4 changed files with 65 additions and 3 deletions

View File

@@ -33,6 +33,12 @@ class GroupDialog(ctk.CTkToplevel):
self.resizable(False, False)
self.transient(master)
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self._on_close)
# Fix: restore dialog when parent is un-minimized
self._master_ref = master
master.bind("<Map>", self._on_parent_map, add="+")
self.bind("<Unmap>", self._on_unmap, add="+")
# ── Name ──
ctk.CTkLabel(self, text=t("group_name"), anchor="w").pack(
@@ -71,7 +77,7 @@ class GroupDialog(ctk.CTkToplevel):
btn_frame.pack(fill="x", padx=20, pady=(15, 10))
ctk.CTkButton(btn_frame, text=t("cancel"), width=80,
fg_color="gray", command=self.destroy).pack(side="left")
fg_color="gray", command=self._on_close).pack(side="left")
ctk.CTkButton(btn_frame, text=t("save"), width=80,
command=self._save).pack(side="right")
@@ -90,6 +96,34 @@ class GroupDialog(ctk.CTkToplevel):
else:
btn.configure(border_color=fg)
def _on_parent_map(self, event=None):
try:
if not self.winfo_exists():
return
self.deiconify()
self.lift()
self.focus_force()
self.grab_set()
except Exception:
pass
def _on_unmap(self, event=None):
try:
self.grab_release()
except Exception:
pass
def _on_close(self):
try:
self._master_ref.unbind("<Map>")
except Exception:
pass
try:
self.grab_release()
except Exception:
pass
self.destroy()
def _save(self):
name = self._name_var.get().strip()
if not name:
@@ -107,4 +141,4 @@ class GroupDialog(ctk.CTkToplevel):
group = self.store.add_group(name, self._selected_color)
self.result = group
self.destroy()
self._on_close()

View File

@@ -62,6 +62,11 @@ class ServerDialog(ctk.CTkToplevel):
# Release grab on close (prevents stuck app)
self.protocol("WM_DELETE_WINDOW", self._on_close)
# Fix: restore dialog when parent is un-minimized
self._master_ref = master
master.bind("<Map>", self._on_parent_map, add="+")
self.bind("<Unmap>", self._on_unmap, add="+")
self._field_frames: dict[str, ctk.CTkFrame] = {}
self._build_ui(server)
@@ -485,8 +490,31 @@ class ServerDialog(ctk.CTkToplevel):
except ValueError as e:
self._show_error(str(e))
def _on_parent_map(self, event=None):
"""Force-restore dialog when parent window is un-minimized."""
try:
if not self.winfo_exists():
return
self.deiconify()
self.lift()
self.focus_force()
self.grab_set()
except Exception:
pass
def _on_unmap(self, event=None):
"""Release grab when dialog is minimized to prevent input lock."""
try:
self.grab_release()
except Exception:
pass
def _on_close(self):
"""Release grab and destroy — prevents stuck app on minimize."""
try:
self._master_ref.unbind("<Map>")
except Exception:
pass
try:
self.grab_release()
except Exception:

View File

@@ -1,6 +1,6 @@
"""Version info for ServerManager."""
__version__ = "1.9.13"
__version__ = "1.9.14"
__app_name__ = "ServerManager"
__author__ = "aibot777"
__description__ = "Desktop GUI for managing remote servers"