Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions TeXmacs/progs/texmacs/texmacs/tm-view.scm
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,7 @@
(save-zoom (get-init-page-rendering))
(set! saved-informative-flags (get-init "info-flag"))
(init-env "info-flag" "none")
(full-screen-mode #t #f)
(fit-to-screen-width))))
(full-screen-mode #t #f))))

(tm-define (toggle-full-screen-edit-mode)
(:synopsis "Toggle full screen edit mode")
Expand Down
42 changes: 42 additions & 0 deletions devel/0319.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# [0319] 优化全屏模式

## 1 相关文档
- [dddd.md](dddd.md) - 任务文档模板

## 2 任务相关的代码文件
- `src/Edit/Editor/edit_typeset.cpp`
- `TeXmacs/progs/texmacs/texmacs/tm-view.scm`

## 3 如何测试

### 3.1 确定性测试(单元测试)
```bash
./bin/test_all
```

### 3.2 非确定性测试(文档验证)
使用 Marketing/客户服务/蒋浩然教授/3DEC 三维离散元法讲义.tmu 进行测试,打开文档并尝试进入演讲模式,不应该存在长时间卡顿与多次重排,应在1秒钟左右进入全屏模式,且编辑区域不会出现缩放应不变,不会出现页面过大的情况

## 4 如何提交

提交前执行以下最少步骤:

```bash
git diff HEAD
git commit -a -m "[0319] 优化全屏模式切换性能并修复连带的缩放问题"
```

## 5 What
1. 优化了环境改变时的更新机制,当 `info-flag` 发生改变时,不再触发高耗时的整树排版环境更新(`THE_ENVIRONMENT`)。
2. 作为该性能优化的连带修复,移除了在进入全屏模式时自动调用 `fit-to-screen-width` 的行为,避免因环境同步时序变化引发的异常缩放 Bug。

## 6 Why
**核心问题:性能瓶颈**
原先在进入和退出全屏(如演讲模式)时,系统会修改 `info-flag` 的值。底层在处理环境变动时,默认会对这类变动发起 `notify_change(THE_ENVIRONMENT)` 通知,导致排版引擎进行阻塞式的“整树重排”。对于大型演示文档(如拥有上百页幻灯片的讲义),这会引发严重的卡顿,体验极差。为了提升性能,必须屏蔽由 `info-flag` 触发的这部分无谓排版开销。

**衍生问题:缩放失真**
在实现了 `info-flag` 的性能优化后,全屏操作变得极其顺滑且无阻塞。但随之而来的是,Scheme 层在触发 `full-screen-mode` 后立即执行的 `fit-to-screen-width` 会在操作系统的物理窗口来得及改变前,读取到处于“窄屏幕尺寸”下的旧窗口宽度。再结合内部排版映射率(因剥离了重排阻塞而未刷新),导致计算出的缩放比例(Zoom Factor)大得离谱,使文档过分放大。鉴于基于异步延迟执行(如 `delayed`)的 Workaround 并不可靠,因此决定直接移除全屏模式进入时的自动缩放计算。

## 7 How
1. **C++ 层(性能优化):** 在 `src/Edit/Editor/edit_typeset.cpp` 的 `edit_typeset_rep::init_env` 和 `edit_typeset_rep::init_default` 函数中,特别加入了针对 `info-flag` 的条件判断:当变量名为 `info-flag` 时,跳过 `notify_change (THE_ENVIRONMENT)`,直接返回,切断不必要的整树重排链条。
2. **Scheme 层(解决Bug):** 在 `TeXmacs/progs/texmacs/texmacs/tm-view.scm` 文件中的 `toggle-full-screen-mode` 函数中,原本在执行完 `(full-screen-mode #t #f)` 后会调用 `(fit-to-screen-width)`。将其移除,全屏切换时只负责全屏化操作,不再主动触发缩放计算,从而从根本上避免了此 Bug 的发生,并将这个逻辑统一应用到所有全屏模式。
3 changes: 2 additions & 1 deletion src/Edit/Editor/edit_typeset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -989,6 +989,7 @@ edit_typeset_rep::init_env (string var, tree by) {
if (init (var) == by) return;
init (var)= by;
if (var == "full-screen-mode") return;
if (var == "info-flag") return;
if (var != PAGE_SCREEN_WIDTH && var != PAGE_SCREEN_HEIGHT &&
var != ZOOM_FACTOR)
require_save ();
Expand All @@ -1001,7 +1002,7 @@ edit_typeset_rep::init_default (string var) {
init->reset (var);
if (stydef->contains (var)) pre (var)= stydef[var];
else pre->reset (var);
notify_change (THE_ENVIRONMENT);
if (var != "info-flag") notify_change (THE_ENVIRONMENT);
}

/******************************************************************************
Expand Down
Loading