麒麟OS V10 SP1默认不保存窗口位置,因GNOME禁用窗口记忆策略;需检查dconf中/org/gnome/desktop/wm/preferences/设置,优先使用--geometry参数启动应用实现精准定位。

窗口位置不保存?先确认是否启用了 gnome-shell 的扩展机制
麒麟OS V10 SP1 桌面基于 GNOME,但默认禁用部分底层窗口管理策略——包括窗口位置记忆。它不像 Windows 或 macOS 那样自动记录每个应用的最后坐标,而是依赖桌面环境级扩展或手动配置。如果你发现每次打开 gedit、firefox 或自定义 Qt 应用都回到屏幕左上角,大概率是 org.gnome.shell.extensions.window-list 未启用,或更关键的:dconf 中的窗口位置策略被重置为默认值。
实操建议:
- 打开终端,运行
dconf read /org/gnome/desktop/wm/preferences/auto-raise,若返回false,说明基础窗口行为已降级;应设为true(但注意:这仅影响焦点提升,不直接保存坐标) - 真正起作用的是
/org/gnome/desktop/wm/keybindings/下的快捷键绑定,以及应用自身是否支持--geometry参数启动 - 部分国产应用(如金山WPS、永中Office)会绕过 GNOME 窗口管理器,自行缓存位置到
~/.config/wps-office/等私有路径,这类行为不可控,需单独查其配置文件
gtk-application-prefer-dark-theme 类配置不影响窗口坐标,别在错误方向折腾
很多用户误以为主题、DPI、缩放设置会影响窗口位置记忆,其实完全无关。GNOME 的窗口坐标存储由 metacity(或 mutter)负责,与 GTK 主题、字体渲染、暗色模式开关(gtk-application-prefer-dark-theme)无任何数据通路。改了这些参数后窗口位置依旧重置,不是配置没生效,而是压根没走那条链路。
容易踩的坑:
- 在
dconf-editor里反复修改/org/gnome/desktop/interface/下的项,却漏看了/org/gnome/desktop/wm/preferences/ - 用
gsettings reset-recursively org.gnome.desktop.wm清空设置后,未重新登录会话,导致新策略未加载 - 通过麒麟“系统设置→外观→窗口边框”切换主题时,后台会重启
mutter,临时丢失未持久化的窗口状态(比如拖动中的位置),这不是 bug,是设计使然
手动指定启动位置:对命令行启动的应用最可靠
如果你控制应用的启动方式(比如从终端、脚本或快捷方式启动),用 --geometry 是目前麒麟OS下唯一稳定生效的位置控制手段。它绕过 GNOME 的窗口管理缓存逻辑,由应用自身解析并定位。支持该参数的典型应用包括 gedit、evince、xfce4-terminal(需额外安装),但 firefox 和 chrome 已弃用该参数,改用 --window-position。
示例:
gedit --geometry=800x600+200+150
其中 +200+150 表示距屏幕左边缘 200px、上边缘 150px。注意:
- 必须是整数,不支持百分比或
center关键字 - 多屏环境下,坐标以主屏左上角为原点,副屏区域需手动计算偏移(例如副屏在右侧且宽 1920,则
+2120+100才能落在副屏左上区域) - 如果应用本身已记录过位置(如 VS Code 写入
~/.config/Code/Local Storage/),--geometry可能被忽略——此时要先删对应缓存再试
第三方工具 devilspie2 可接管窗口定位,但兼容性风险高
在 GNOME 原生机制失效时,devilspie2 是少数能实时捕获新窗口并强制移动/调整大小的工具。它通过 Lua 脚本匹配窗口类名(get_window_class())、标题(get_window_name())等特征,再调用 set_window_position(x, y)。对麒麟OS来说,它确实能工作,但有两个硬伤:
- 麒麟V10 SP1 默认未预装,需手动
sudo apt install devilspie2,且依赖liblua5.2,部分国产驱动包会冲突导致mutter崩溃 - 脚本规则一旦写错(比如正则匹配过宽),可能把系统对话框、通知也拖走,造成操作中断;调试时建议先加
print(get_window_class())日志再部署 - 它无法保存“下次启动仍在此处”,只是单次定位;要实现记忆效果,得配合
xdotool getwindowgeometry回写坐标到文件,再在下次启动时读取——这就变成半自研方案了
真正难的不是写脚本,而是判断哪个窗口属于你关心的那个进程。麒麟OS里很多应用用 AppImage 或沙箱封装,get_window_class() 返回的是通用名(如 appimagelauncher),而非你期望的 firefox。

















