求助修复GNOME Shell无法管理所有打开窗口及会话窗口位置不恢复的问题
求助修复GNOME Shell无法管理所有打开窗口及会话窗口位置不恢复的问题
兄弟,我太懂你这种重启后窗口乱成一锅粥的崩溃了!之前升级到Ubuntu 20.04之后,GNOME的会话恢复功能就开始抽风,多开几个Firefox窗口重启后手动整理的那种烦躁感我完全体会过。刚好你已经开始用wmctrl排查了,我来分享几个亲测有效的解决办法:
一、先确认GNOME核心会话恢复配置
首先得确保GNOME自带的会话恢复功能是正常开启的,有时候升级系统后这个设置会被莫名重置:
- 先安装
dconf-editor(如果没装的话):sudo apt install dconf-editor - 打开
dconf-editor后,导航到org > gnome > gnome-session,找到auto-save-session选项,把它设为on - 另外,再检查
org > gnome > desktop > session里的session-name,确保是gnome而不是其他自定义名称,避免会话识别异常
二、用wmctrl写脚本实现精准窗口恢复
既然你已经在接触wmctrl了,那这个方法绝对能解决你的痛点——手动保存当前窗口布局,登录后自动恢复:
- 先把所有窗口摆到你想要的位置和对应工作区,然后运行这个命令保存布局:
wmctrl -lG > ~/.window_layout_config
- 接下来创建一个恢复脚本,比如
~/.config/autostart/window_restorer.sh,内容如下:
#!/bin/bash # 给自启动应用留足加载时间,根据你的应用数量调整秒数 sleep 12 # 读取保存的布局文件,逐个调整窗口 while read -r win_data; do # 拆分窗口信息:窗口ID、工作区、X坐标、Y坐标、宽度、高度 win_id=$(echo "$win_data" | awk '{print $1}') target_workspace=$(echo "$win_data" | awk '{print $2}') pos_x=$(echo "$win_data" | awk '{print $3}') pos_y=$(echo "$win_data" | awk '{print $4}') win_width=$(echo "$win_data" | awk '{print $5}') win_height=$(echo "$win_data" | awk '{print $6}') # 移动窗口到目标工作区 wmctrl -i -r "$win_id" -t "$target_workspace" # 调整窗口位置和大小 wmctrl -i -r "$win_id" -e 0,"$pos_x","$pos_y","$win_width","$win_height" done < ~/.window_layout_config
- 给脚本加上执行权限:
chmod +x ~/.config/autostart/window_restorer.sh
- 最后把这个脚本添加到自启动:打开
gnome-session-properties,点击「添加」,名称填「窗口布局恢复脚本」,命令填/home/你的用户名/.config/autostart/window_restorer.sh(记得替换成你的实际用户名),注释随便写就行
三、单独修复Firefox的窗口恢复问题
Firefox有时候会自己接管会话恢复,和GNOME的功能冲突,你可以这么调整:
- 打开Firefox,输入
about:preferences进入设置页 - 找到「常规」里的「启动时」,选择「恢复上次会话」
- 再到「性能」设置里,取消勾选「使用推荐的性能设置」,然后关掉「使用硬件加速(如果可用)」——硬件加速有时候会和GNOME的窗口管理逻辑冲突
- 重启Firefox后再测试,看看重启系统后Firefox的窗口能不能正常归位
四、排查第三方扩展冲突
很多第三方GNOME扩展(比如窗口管理类、dock类的)会和原生会话恢复功能冲突,你可以这么排查:
- 打开「GNOME 扩展」应用,先把所有第三方扩展都禁用
- 重启系统,看看窗口恢复是不是正常了
- 如果正常了,再逐个启用扩展,每次重启后测试,找到那个导致冲突的扩展,要么更新它要么暂时禁用
备注:内容来源于stack exchange,提问作者jonjt488
相关产品推荐
相关产品推荐

