fix(explorer): 窗口创建/销毁时整体置脏,避免内容残留
抽出 mark_all_windows()(所有可见窗口整体置脏,含阴影带),CREATE 与 DESTROY 分支各调用一次并保留 mark_titles()。原来这两处只标记标题栏 + 任务栏:新建窗口的内容区不脏(可能空白),关窗后下方露出的旧内容也不会重画,都要等鼠标经过才恢复。focus() 的内联循环同步收敛到该函数。
This commit is contained in:
1 parent
fbbb10099d
commit
0593f1798b
1 file changed
+11
-6
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user