Skip to content

Conversation

@yaoyaozijing
Copy link
Contributor

1.启动时记忆上次窗口大小和位置;
2.第一次启动、以及从默认尺寸的小窗模式直接退出后,启动时会设置窗口尺寸,逻辑与之前一样;
3.进入小窗模式时记忆正常模式窗口尺寸,退出小窗模式时恢复对应尺寸;
4.小窗模式横纵比锁定为16:9,退出小窗模式后恢复正常;

5.限制桌面端窗口最小尺寸为(320,270),避免调试时窗口太小导致闪退的麻烦,也可以减少开发者在过小宽度下的无用考量。其中320为移动设备安全宽度。现在几乎不存在宽度小于320的手机,Kazumi也没有为这个宽度以下的设备做优化,更小的宽度本就会出现一些布局问题,320宽度给移动设备做参照用应该够了。270为小窗模式默认高度。

@Predidit
Copy link
Owner

这个实现看上去不错,但有两个问题

  1. 为什么要在 windowManager.show() 调用之后再设定大小,这在一些低速设备上可能导致窗体闪烁
  2. 这个实现经过充分测试吗,windowsManager 插件并不是那么的成熟,它的很多行为在不同平台不一致

@yaoyaozijing
Copy link
Contributor Author

1.因为要判断上一次是不是从小窗模式意外退出的,所以得读一次记忆的窗口大小,应该需要先show。如果不判断小窗的话,可以移到前面去实现。
2.mac和windows没有什么问题,linux的话Plasma桌面除了窗口位置尺寸记忆不生效,最小尺寸、小窗按比例调整是可以的。

@Predidit
Copy link
Owner

这里变成了一个权衡,也就是在启动闪烁和窗口记忆中二选一

其他 flutter 应用似乎都没有实现这个复杂的窗口记忆功能

@yaoyaozijing
Copy link
Contributor Author

yaoyaozijing commented Dec 16, 2025

不,记忆不是我实现的,而是原本就有的。
我只是去掉了窗口启动时设置尺寸这一行为,它干扰了窗口尺寸和位置记忆。

@Predidit
Copy link
Owner

但是 show 之后设置确实会在低速设备上导致闪烁,这个之前专门修复过

@yaoyaozijing
Copy link
Contributor Author

那直接去掉这一串代码就行了。根据main.cpp和AppDelegate.swift现在的写的内容,第一次启动时Windows尺寸为(1280,720),Mac尺寸为(1280,860),窗口尺寸还算正常,没有必要额外设置尺寸。

@Predidit
Copy link
Owner

Predidit commented Dec 17, 2025

这个实现看上去不够健壮。

kazumi 直接调用 exit(0) 进行强退,这导致在某些情况下,正常退出也可能不触发窗体保存。

以及常量命名存在问题,某些情况下会出现混淆,defaultWindowState 会比 lastWindowState 更好。

@1312853182
Copy link
Contributor

启动时记忆上次窗口大小和位置,
软件有时候会出现因为位置不对无法正常使用且很难恢复的情况,没加这个功能的时候可以简单地重启,
如果每次启动时记忆上次窗口大小和位置,怎么解决之前的问题?

@yaoyaozijing
Copy link
Contributor Author

启动时记忆上次窗口大小和位置, 软件有时候会出现因为位置不对无法正常使用且很难恢复的情况,没加这个功能的时候可以简单地重启, 如果每次启动时记忆上次窗口大小和位置,怎么解决之前的问题?

的确是个问题,不好解决,我没有解决这个问题。
我撤回自行实现代码,并仅对macOS实现窗口记忆,这是macOS提供的记忆功能,没有这些问题,其他的平台保持原样,不引入其他更改。

@yaoyaozijing
Copy link
Contributor Author

撤回了Windows和Linux平台的实现,且在WindowOptions里写窗口尺寸和居中,以规避前面提到的低性能设备窗口抖动问题。
下面是详细修改:

  1. 仅对Windows居中窗口,避免干扰其他平台默认行为,macOS会自动记忆上次窗口位置,linux wayland下使用默认窗口位置(Plasma默认居中,可自行设置为最小重叠、随机等)。
  2. 仅对Windows设置窗口大小,避免干扰其他平台默认行为,macos会自动记忆上次窗口尺寸。
  3. 在各平台原生代码中,窗口均初始化为1280x720分辨率。
  4. 由于低分辨率检测在linux上存在问题,而macOS支持记忆窗口大小,因此只需要检测Windows的低分辨率情况,并在此时设置尺寸为840x600,其他情况设为null以避免干扰。

经测试,在macOS下可以正常记忆窗口尺寸和位置,在kde plasma下跟随默认窗口规则,在Windows下保持原有行为。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants