From 0593f1798b9d6ffcfffd165fdceeee79f7a8e6ed Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 17 Oct 2026 11:53:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(explorer):=20=E7=AA=97=E5=8F=A3=E5=88=9B?= =?UTF-8?q?=E5=BB=BA/=E9=94=80=E6=AF=81=E6=97=B6=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E7=BD=AE=E8=84=8F=EF=BC=8C=E9=81=BF=E5=85=8D=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=AE=8B=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 抽出 mark_all_windows()(所有可见窗口整体置脏,含阴影带),CREATE 与 DESTROY 分支各调用一次并保留 mark_titles()。原来这两处只标记标题栏 + 任务栏:新建窗口的内容区不脏(可能空白),关窗后下方露出的旧内容也不会重画,都要等鼠标经过才恢复。focus() 的内联循环同步收敛到该函数。 --- Apps/Explorer/desk_server.vp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Apps/Explorer/desk_server.vp b/Apps/Explorer/desk_server.vp index 102a870..94b4718 100644 --- a/Apps/Explorer/desk_server.vp +++ b/Apps/Explorer/desk_server.vp @@ -238,6 +238,13 @@ class DeskServer: if y + h + SHADOW_BOTTOM > tb: self.mark(tb, TASKBAR_H) + # 窗口集合/层级变化:所有可见窗口整体置脏(含阴影带) + def mark_all_windows(self): + for i in range(desk.DESK_MAX_WIN): + w: desk.WinSlot* = self.slot(i) + if w.used != 0 and w.active != 0 and w.minimized == 0: + self.mark_win(w.uy, w.h) + # 活动窗口切换会改变标题栏配色:把所有窗口的标题栏行置脏 def mark_titles(self): for i in range(desk.DESK_MAX_WIN): @@ -1085,6 +1092,7 @@ class DeskServer: if nw >= 0: ns: desk.WinSlot* = self.slot(nw) string.memcpy(&ns.title, &m.title, uint64(desk.DESK_TITLE_MAX)) + self.mark_all_windows() self.mark_titles() self.push_event_pid(m.pid, nw, uint32(desk.DESK_EVT_CREATED), nw, 0, 0, 0) return @@ -1097,6 +1105,7 @@ class DeskServer: self.mark(s.uy, s.h) s.used = 0 if self.focused == win: self.focused = -1 + self.mark_all_windows() self.mark_titles() elif ty == uint32(desk.DESK_REQ_MOVE): self.mark_win(s.uy, s.h) @@ -1150,12 +1159,8 @@ class DeskServer: self.next_z += 1 s.z_order = self.next_z self.focused = win - # 层级变化会改变窗口互相覆盖的关系:把所有可见窗口整体置脏重画, - # 否则被抬起的窗口只重画标题栏,内容区仍露出原来压在上面的窗口,直到鼠标经过。 - for i in range(desk.DESK_MAX_WIN): - w: desk.WinSlot* = self.slot(i) - if w.used != 0 and w.active != 0 and w.minimized == 0: - self.mark_win(w.uy, w.h) + # 层级变化会改变互相覆盖的关系:所有可见窗口整体置脏 + self.mark_all_windows() self.mark_titles() def _move_cursor(self, dx: int, dy: int) -> int: